Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
解析:由于头结点的值可能也是重复的所以连头结点也需要改变,为了避免这种复杂的情况我们加入了另一个前置节点使得此题和第一问的删除冗余元素的解法类似。
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
class Solution {
ListNode deleteDuplicates(ListNode head) {
if (head==null||head.next==null)
return head;
ListNode prehead=new ListNode(0);
prehead.next=head;
ListNode p=prehead;
ListNode middle=p.next,t=null,rear=null;
rear=middle.next;
boolean dup=false;
while (rear!=null) {
while (rear!=null&&middle.val==rear.val) {
rear=rear.next; //当前面的是重复元素的时候,新增的头结点的指向直接指向后面的元素
dup=true;
}
if(dup){//如果重复了,则需要把之前重复的都删掉啊。让头结点指向后面的第一个元素
p.next=rear;
middle=rear;
if (rear!=null) {
rear=rear.next;
}
}
else {//如果不重复,那就是当前的第一个节点可以进入,但是第二个节点还是要和后面节点重新比较的。
p=middle;
middle=rear;
rear=rear.next;
}
dup=false;
}
return prehead.next;
}