题目:Remove Duplicates from Sorted List II
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
.
这道题和下一道题83题很相近,所不同的是,这道题只要有重复的就将其全部删除。因此,首先是删除重复的结点,只留下那个比较的结点,最后再将这个结点也删除了就可以了。这道题首先设置了一个空的头结点dummy,方便操作,不用单独对头进行处理。
具体思路看下面的代码,应该看了代码就很容易理解了。
public class Solution {
public static ListNode deleteDuplicates(ListNode head) {
if( head == null || head.next == null ){
return head;
}
//设置了一个空的头结点dummy,方便操作,不用单独对头进行处理
ListNode dummy = new ListNode(-1);
dummy.next = head;
//pre结点始终保持在p之前,为的是有重复的话可以删除p结点
ListNode pre = dummy, p = head, q = p.next;
boolean flag = false; //设置一个flag,标记如果有重复的且执行了删除动作之后设置flag为true
while( q != null ){
if( p.val == q.val ){
q = q.next;
p.next = q;
flag = true;
}
else{ //等删除完重复的结点之后判断是否执行了删除动作
if( flag == true ){ //如果执行了删除动作则将此时正在指向重复结点的p删除
pre.next = q;
flag = false; //再将flag设置回去为false
}
else{
pre = p;
}
p = q;
q = q.next;
}
//这个判断是处理如果最后一个结点也是重复的话删除最后一个结点
if( q == null && flag == true ){
pre.next = q;
//此时也应该像上面一样将flag设置回去为false,不过因为链表结束了
//不用再设置了
}
}
//System.out.println(pre.val);
return dummy.next;
}
}