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;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。