题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
解题思路
设置两个根节点p1和p2,p1负责更改原链表,p2负责检测并跳过重复的节点。
当发现p2与p2的下一个节点值相等时,将p2后移直到p2指向的节点为非重复节点为止。
关键在于,在p2的后移过程中,当发现p2的值不等于p2.next时,p2.next可能与p2.next.next值相等,即p2.next同为一个需要被删除的重复节点,所以这时需要再次判断一下,并且如果p2.next确实需要被删除,需要修改当前temp(标记当前重复值的变量)的值。
代码
public class DeleteDuplicateNodes {
public static ListNode<Integer> deleteDuplication(ListNode pHead){
ListNode<Integer> root = pHead;
ListNode<Integer> p1=null, p2=pHead;
while(p2!=null && p2.next!=null){
if(p2.next.val==p2.val){
int temp = p2.val;
while(p2!=null){
p2=p2.next;
if (p2==null) break;
if(p2.val!=temp){
if(p2.next==null || p2.val!=p2.next.val)
break;
else{
temp=p2.val;
}
}
}
}
// 更改原链表
if(p1!=null)p1.next=p2;
else root=p2;
// 将p1、p2后移
p1=p2;
if(p2!=null) p2=p2.next;
}
return root;
}
}
public static void main(String[] args) {
ListNode list1 = new ListNode(1,2,3,3,4,4,5);
list1.showValues();
deleteDuplication(list1).showValues();
}
}