删除链表中重复的节点

Posted OneDay-X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除链表中重复的节点相关的知识,希望对你有一定的参考价值。

一道来自剑指offer的编程题,题目描述如下:

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

  • 思路比较简单,就是从头结点开始遍历链表,若遇到(p->val == p->next->val)则删除p的下一节点(p->next),但是题目要求重复的节点不能保留,这才是题目的关键点,即需要删除此时的p节点,但是由于此情况下如果直接删除p节点,那么链表将导致断裂,所以需要额外引进一个p的前置节点(pre),并将pre的初始值赋为NULL用来判断需要删除的重复节点p是否为首节点。具体实现如下:
    (ps:自己当时一个很智障的错误是while语句的第二行没有加temp的非空判断,导致程序非法访问出错,所以,严谨一点很重要)

/*
struct ListNode 
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) 
    
;
*/
class Solution 
public:
    ListNode* deleteDuplication(ListNode* pHead) 
        if (pHead == NULL || pHead->next == NULL) return pHead;
        ListNode* p = pHead;
        ListNode* pre = NULL;
        bool flag = false;
        while (p) 
            ListNode* temp = p->next;
            if (!flag && temp && (p->val != temp->val)) pre = p;
            if (temp != NULL && p->val == temp->val) 
                p->next = temp->next;
                delete temp;
                temp = NULL;
                flag = true;
             else 
                if (flag) 
                    if (pre != NULL) pre->next = p->next;
                    else pHead = p->next;
                    ListNode* toDel = p;
                    p = p->next;
                    delete toDel;
                    toDel = NULL;
                    flag = false;
                    continue;
                
                p = p->next;
            
        
        return pHead;
    
;

以上是关于删除链表中重复的节点的主要内容,如果未能解决你的问题,请参考以下文章

58.删除链表中重复的节点

删除链表中重复的元素

删除链表中重复的节点

剑指OFFER_删除链表中重复的节点

c_cpp 从已排序的链表中删除重复值节点 - Hackerrank

剑指Offer删除链表中重复的节点