#在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5->5 处理后为 1->2->5
题目分析:排序列表,说明列表已经有序,相同元素的结点相邻(逻辑上)
定义一个先驱结点dummyHead和链表相连 null->1->2->3->3->4->4->5
定义两个结点,一个node=phead next=phead.next
如果两个结点值不相等,都相后走一步,否则,node不动,走到next.val!=node.val;
prev.next=next.next;
迭代法:
public static ListNode deleteDuplication(ListNode pHead){
if(pHead==null||pHead.next==null){
return pHead;
}
ListNode dummyHead=new ListNode(-1);
dummyHead.next=pHead;
ListNode prev=dummyHead,node=pHead,next=pHead.next;
while(next!=null){
//1 2 3 3 4 4 5 5
//1 1 1 1 1 1 1 1
if(node.val==next.val){
ListNode temp=node;
while(next!=null&&next.val==node.val){
next=next.next;
temp=temp.next;
}
prev.next=temp.next;
temp.next=null;
if(prev.next!=null) {
node = prev.next;
next = node.next;
}else{
break;
}
}else{
next=next.next;
node=node.next;
prev=prev.next;
}
}
return dummyHead.next;
递归法
if(pHead==null||pHead.next==null){
return pHead;
}
ListNode curr=null;
if(pHead.next.val==pHead.val){//如果相等
curr=pHead.next.next;//定义当前节点
while(curr!=null&&curr.val==pHead.val){//如果当前节点不等于空并且和phead相等
curr=curr.next;//继续向下走走到不相等为止
}
return deleteDuplication(curr);让curr与下一个结点比较
}else{//如果不相等
curr=pHead.next;//向下走一个
pHead.next=deleteDuplication(curr);//判断下一个结点和和棋下一个是否相等
return pHead;
}