力扣 203. 移除链表元素
有个处理链表的技巧,在待处理的链表头加上一个自己设计的头。这个头指向原来链表的头部。
定义一个自己的头节点s,s.next 指向原来链表的头部,这样就不用另外考虑链表的头部元素是val这种特殊情况。然后定义两个结点a和b,初始化a指向s,b指向s.next。b用来遍历每个节点。通过a,b两个结点,可以让被b的前一个元素的next指向b.next。如果最后一个元素的值是val,这种情况不需要特殊处理。
最后return返回的是s.next,不能返回head,如果这个head.val==val,返回head就没法删除值为val的结点。
/**
* 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) {
if(head==null){
return head;
}
ListNode s=new ListNode(-1,head);
ListNode a=s, b=s.next;
while(b!=null){
if(b.val==val){
a.next=b.next;
b=a.next;
} else {
a=a.next;
b=b.next;
}
}
return s.next;
}
}