删除链表中等于给定值 val 的所有节点。
如:
原链表:1->2->1->3->5->1->null
新链表:2->3->5->null
删除的过程中,该操作数的前驱结点很关键。尤其应该注意第一个结点,因为第一个结点没有前驱结点。
方法一:如果是第一个结点,对它进行特殊处理。
public Node removeElement(Node head,int val){
Node prev=null;
Node cur=head;
while(cur!=null){
if(cur.val!=val){
prev=cur;
}
else{
if(cur==head){
head=cur.next;
}
else{
prev.next=cur.next;
}
}
cur=cur.next;
}
return head;
}
方法二:先避开第一个结点,之后再说。
public Node removeElement2(Node head,int val){
Node prev=head;
Node cur=head.next;
while(cur!=null){
if(cur.val==val){
prev.next=cur.next;
}
else{
prev=cur;
}
cur=cur.next;
if(head.val==val){
head=head.next;
}
}
return head;
}
方法三:强行给第一个结点找一个前驱。
public Node removeElement3(Node head,int val){
Node tmpHead=new Node(-1);
tmpHead.next=head;
Node prev=tmpHead;
Node cur=head;
while(cur!=null){
if(cur.val==val){
prev.next=cur.next;
}
else{
prev=cur;
}
cur=cur.next;
}
return tmpHead.next;
}