剑指offer算法题:删除链表中重复的结点deleteDuplication

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

preNode为当前节点的前一个节点:

  1. 没有重复时不断随着当前节点的移动而移动,步调一致;
  2. 当有重复时,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;
发布了239 篇原创文章 · 获赞 70 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43777983/article/details/104151372