/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
//整个链表只扫描一遍,故时间复杂度为o(n);
//主要是重复节点不保留
auto dummy=new ListNode(-1);//创建一个虚拟头结点,这样就免去了考虑头结点是重复节点的步骤
dummy->next=head; //来使dummy成为虚拟头结点
auto p=dummy;//p为上次保留节点的最后一个位置。
while(p->next)
{
auto q=p->next;//q存的是下段的第一个节点
while(q&&p->next->val==q->val) q=q->next;//将q更新为q的下一个节点值不等于q->val的节点
if(p->next->next==q) p=p->next; //第一种情况,下段情况是1的时候,就更新p为p的下一个结点就行
else p->next=q; //第二种情况,出现重复元素,则将p的next指针指向更新后的q。以此达到删除重复节点的作用
}
return dummy->next;
}
};
剑指offer 29.删除链表中重复的节点
最新推荐文章于 2024-06-12 10:00:23 发布