package java_jianzhioffer_algorithm;
/**
* 题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
* 重复的结点不保留,返回链表头指针。
* @author hexiaoli
* 思路:参照java面宝
* 1)不需要额外空间,剑指offer上推荐的
*/
class ListNode_D {
int val;
ListNode_D next = null;
ListNode_D(int val) {
this.val = val;
}
}
public class DeleteDuplicationNode {
public static ListNode_D deleteDuplecate(ListNode_D pHead) {
if(pHead == null || pHead.next ==null) {
return pHead;// 只有0个或1个结点,则返回
}
if(pHead.val == pHead.next.val) {// 当前结点是重复结点
ListNode_D tmp = pHead;
// 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点
while(tmp!=null && pHead.val == tmp.val) {
tmp =tmp.next;
}
return deleteDuplecate(tmp);// 从第一个与当前结点不同的结点开始遍历
}else { // 当前结点不是重复结点
pHead.next =deleteDuplecate(pHead.next);
return pHead;
}
}
public static void main(String[] args) {
ListNode_D phead = new ListNode_D(1);
ListNode_D phead1 = new ListNode_D(2);
ListNode_D phead2 = new ListNode_D(3);
ListNode_D phead3 = new ListNode_D(3);
ListNode_D phead4 = new ListNode_D(4);
ListNode_D phead5 = new ListNode_D(4);
ListNode_D phead6 = new ListNode_D(5);
phead.next = phead1;
phead1.next = phead2;
phead2.next = phead3;
phead3.next = phead4;
phead4.next = phead5;
phead5.next = phead6;
phead6.next = null;
deleteDuplecate(phead);
ListNode_D temp = phead;
while(phead!=null){
System.out.println(phead.val);
phead = phead.next;
}
}
}