剑指offer-56:删除链表中重复的结点
定义一个虚拟元素dummy指向链表头节点,以处理边界情况。
之后从前至后扫描整个链表,扫描若干分段,如果对应段中的元素个数多于1个,表明该段为链表中的重复节点段,将上述整段元素直接删除即可。
由于整个链表只遍历一遍,因此时间复杂度为O(n)。
具体代码如下:
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; //如果该段只有1个元素,直接向后扫描
else p->next = q; //如果该段元素个数大于1,删除该段的重复元素
}
return dummy->next;
}
};