剑指offer56_删除链表中重复的结点_题解
删除链表中重复的结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
分析
方案一:直接删除
算法流程:
- 初始化辅助头节点 \(dummy\) 指向实际头节点 \(pHead\),设置结点 \(pre\) 指向 \(dummy\),结点 \(cur\) 指向 \(pHead\)
- 当 \(cur\) 不为空时
- 如果 \(cur->next\) 不为空且 \(cur\) 和 \(cur->next\) 的结点值相等,则说明结点重复。
- \(cur\) 指针进入循环继续前进,直到 \(cur\) 和 \(cur->next\) 的结点值不相等退出循环
- 此时 \(cur\) 指向的是最后一个重复值, 需要让 \(cur\) 再往前前进一步,指向第一个不重复的值,并调整 \(pre\) 指针的 \(next\) 指向第一个不重复的值
- 否则调整 \(pre\)指针为 \(cur\),\(cur\) 指针再前进一步
- 如果 \(cur->next\) 不为空且 \(cur\) 和 \(cur->next\) 的结点值相等,则说明结点重复。
代码
/*
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;
}
};

浙公网安备 33010602011771号