在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
preNode为当前节点的前一个节点:
- 没有重复时不断随着当前节点的移动而移动,步调一致;
- 当有重复时,preNode不动,直到遇到不重复时指向当前节点的next(删除重复节点)。
要注意最后一个节点,如果最后一个节点为重复节点时,preNode应该指向null。
public class Solution {
public static ListNode deleteDuplication(ListNode pHead)
{
if(pHead == null || pHead.next == null)
return pHead;
ListNode preHead = new ListNode(0);
preHead.next = pHead;
ListNode preNode = preHead;
boolean flag = false; //true说明有重复节点
while(pHead != null) {
ListNode pNext = pHead.next;
if(pNext == null) { //pHead为最后一个节点
if(flag){ //表示重复直至最后一个节点
preNode.next = pNext;
}else { //最后没有重复
preNode.next = pHead;
}
break;
}
//没重复
if(pHead.val != pNext.val) {
if(flag){
pHead = pHead.next;
preNode.next = pHead;
flag = false;
}else {
preNode = pHead;
pHead = pHead.next;
}
//重复了
}else {
pHead = pHead.next;
flag = true;
}
}
return preHead.next;
}
}
if (pHead==null || pHead.next==null){return pHead;}
ListNode Head = new ListNode(0);
Head.next = pHead;
ListNode pre = Head;
ListNode last = Head.next;
while (last!=null){
if(last.next!=null && last.val == last.next.val){
// 找到最后的一个相同节点
while (last.next!=null && last.val == last.next.val){
last = last.next;
}
pre.next = last.next;
last = last.next;
}else{
pre = pre.next;
last = last.next;
}
}
return Head.next;