剑指offer56_删除链表中重复的结点_题解

删除链表中重复的结点

题目描述

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

分析

方案一:直接删除

算法流程:

  1. 初始化辅助头节点 \(dummy\) 指向实际头节点 \(pHead\),设置结点 \(pre\) 指向 \(dummy\),结点 \(cur\) 指向 \(pHead\)
  2. \(cur\) 不为空时
    1. 如果 \(cur->next\) 不为空且 \(cur\)\(cur->next\) 的结点值相等,则说明结点重复。
      1. \(cur\) 指针进入循环继续前进,直到 \(cur\)\(cur->next\) 的结点值不相等退出循环
      2. 此时 \(cur\) 指向的是最后一个重复值, 需要让 \(cur\) 再往前前进一步,指向第一个不重复的值,并调整 \(pre\) 指针的 \(next\) 指向第一个不重复的值
    2. 否则调整 \(pre\)指针为 \(cur\)\(cur\) 指针再前进一步

代码

/*
1.时间复杂度:O(n)
2.空间复杂度:O(1)
*/
class Solution
{
public:
    ListNode *deleteDuplication(ListNode *pHead)
    {
        ListNode *dummy = new ListNode(-1);
        dummy->next = pHead;
        ListNode *pre = dummy, *cur = pHead;

        while (cur)
        {
            if (cur->next && cur->val == cur->next->val)
            {
                while (cur->next && cur->val == cur->next->val)
                {
                    cur = cur->next;
                }
                cur = cur->next;
                pre->next = cur;
            }
            else
            {
                pre = cur;
                cur = cur->next;
            }
        }
        return dummy->next;
    }
};
posted @ 2021-02-26 12:22  RiverCold  阅读(35)  评论(0)    收藏  举报