Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
思路:发现可能要操作头结点,那么就定义dummy node
【前面介绍过,一般会改到链表头的题目就会需要一个辅助指针,是比较常见的技巧。】
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null || head.next==null)
return head;
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode pre=dummy;
ListNode cur=dummy.next;
while(cur!=null){
while(cur.next!=null && pre.next.val==cur.next.val){//【注意1】【注意2】
cur=cur.next;
}
if(pre.next==cur){
pre=pre.next;
cur=cur.next;
}
else{
pre.next=cur.next;
cur=cur.next;
}
}
return dummy.next;
}
}
【注意1】此处的技巧,为防止空指针异常,,外层条件是cur!=null,里层条件是cur.next.val,那么一定要在cur有next的情况下,所以要在里层条件加上“&& cur.next!=null”。。
而且一定要写成while( cur.next!=null && pre.next.val!=cur.next.val),否则会空指针异常
【注意2】起初我在纠结dummy.val为0,如果dummy.next.val也为0怎么处理,根本就不该把dummy.val考虑进来。
正确方法是,一旦定义dummy,就从dummy.next作为循环中的目标处理。