题目
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
提示:
列表中的节点数目在范围 [0, 10^4] 内
1 <= Node.val <= 50
0 <= val <= 50
思路1
无虚拟头节点,分情况判断边界条件:
- 头节点不为空,且头节点就是待删除节点:直接删除头节点。
- 头节点为空:直接返回空。
- 头节点不为空,且头节点不是待删除节点:先要找到待删除节点的前驱节点,再进行删除。
代码1
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//先判断边界条件
//头节点不为空,且头节点就是待删除节点
while(head != null && head.val == val) { //一定要用while,可能出现连续多个头节点都是待删除节点的情况。此处一定是先判空,再判断值是否相等
ListNode node = head;
head = head.next;
node.next = null;
}
//头节点为空
if(head == null) {
return null;
} else { //头节点不为空,且头节点不是待删除节点
//从头开始寻找值为val的节点
ListNode prev = head;
while(prev.next != null) {
if(prev.next.val == val) {
//node就是待删除的节点
ListNode node = prev.next;
prev.next = node.next;
node.next = null;
} else {
prev = prev.next;
}
}
return head;
}
}
}
思路2
采用虚拟头节点法。
代码2
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode prev = dummyHead;
while(prev.next != null) {
if(prev.next.val == val) {
ListNode node = prev.next;
prev.next = node.next;
node.next = null;
} else {
prev = prev.next;
}
}
return dummyHead.next; //不能是return head
}
}
思路3
采用递归法。
代码3
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null) {
return null;
}
head.next = removeElements(head.next, val); //这一行只能放在中间位置,不能放在最后一行
return head.val == val ? head.next : head;
}
}