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) {if(head==null){return null;}
ListNode cur=head;
ListNode pre=null;
while(cur!=null){if(cur.val==val&&pre==null){
// 如果找到相等值,要判断 cur 是不是头节点(根据 pre==null 来判断),如果为空说明还没遇到不相等的冲点 null 值,此时删除 cur,并且 head 节点向后移动。cur=cur.next;
head=cur;
}else if(cur.val==val&&pre!=null){
//pre 不等于 null,说明删除的前节点有值,直接把 cur 指向他的下下个节点。同时 cur 移动到下一个节点
pre.next=cur.next;
cur=pre.next;
}else{
// 值不相等,pre、cur 同时后移即可
pre=cur;
cur=cur.next;
}
}
return head;
}
}
方法二:用个虚拟前节点,不用考虑 pre 是否为 null 的情况
class Solution {public ListNode removeElements(ListNode head, int val) {
// 创建一个虚拟头结点
ListNode dummyNode=new ListNode(val-1);
dummyNode.next=head;
ListNode prev=dummyNode;
// 确保当前结点后还有结点
while(prev.next!=null){if(prev.next.val==val){prev.next=prev.next.next;}else{prev=prev.next;}
}
return dummyNode.next;
}
}
方法三:递归
class Solution {public ListNode removeElements(ListNode head, int val) {if(head==null){return null;}
head.next=removeElements(head.next,val);
if(head.val==val){return head.next;}else{return head;}
}
}