[AcWing 29] 删除链表中重复的节点
作者:互联网
点击查看代码
/**
* 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) {
auto dummy = new ListNode(-1);
dummy->next = head;
auto p = dummy;
while (p->next) {
auto q = p->next;
while (q && p->next->val == q->val) q = q->next;
if (p->next->next == q) p = p->next;
else p->next = q;
}
return dummy->next;
}
};
- 使用虚拟头结点便于处理头结点的各种情况;
- p 指向新链表的尾结点,q 指向 p 的下一个结点,while(q && p->next->val == q->val) 至少会执行一次(因为 q = p->next),下面分两种情况讨论:
① 若 p->next 结点是不重复的结点,即 p->next->next == q,则把 p 后移一位,把 p->next 加到新链表中;
② 若 p->next 结点是重复的结点,则此时 q 指向的是 q->val != p->next->val 的第一个结点(q 有可能和 q 后面的重复),此时执行 p->next = q,跳过刚刚重复的那段,p->next 此时指向的是一个新的结点,再判断此结点是否重复;
标签:dummy,结点,ListNode,val,重复,29,next,链表,AcWing 来源: https://www.cnblogs.com/wKingYu/p/16179795.html