203.删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
/**
* 为了避免下一个节点还是要删除的节点,这里使用while循环,来进行判断
*/
while (head!=null && head.val == val) {
ListNode delNode = head;
head = head.next;
delNode.next = null;
//以上三行代码可以用一行代替 head = head.next;
}
//再删除掉头节点是需要删除的节点之后,如果后面的节点已经是空了,那就直接返回了
if(head==null) {
return null;
}
ListNode prev = head;
while(prev.next != null) {
if (prev.next.val == val) {
//在删除节点后,prev节点并没有向后移动,这样避免下一个节点还是要删除的节点
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next =null;
//以上三行代码也可以用一行代替prev.next = prev.next.next
} else {
prev = prev.next;
}
}
return head;
}
}
也可以采用虚拟头节点的方式来优化这段代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
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) {
//在删除节点后,prev节点并没有向后移动,这样避免下一个节点还是要删除的节点
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next =null;
} else {
prev = prev.next;
}
}
return dummyHead.next;
}
}