美文网首页
删除链表中重复的节点

删除链表中重复的节点

作者: su945 | 来源:发表于2020-05-01 14:36 被阅读0次

    题目描述

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

    问题分析

    删除重复结点,只需要记录当前结点前的最晚访问过的不重复结点pPre、当前结点pCur、指向当前结点后面的结点pNext的三个指针即可。如果当前节点和它后面的几个结点数值相同,那么这些结点都要被剔除,然后更新pPre和pCur;如果不相同,则直接更新pPre和pCur。

    解题思路1

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
            val(x), next(NULL) {
        }
    };
    */
    class Solution {
    public:
        ListNode* deleteDuplication(ListNode* pHead)
        {
            if(pHead == NULL)
                return NULL;
            ListNode* pPre = NULL;  //指向当前结点前最晚访问过的不重复结点
            ListNode* pCur = pHead; //指向当前处理的结点
            ListNode* pNext = NULL; //指向当前结点后面的结点
            
            while(pCur != NULL){
                //如果当前结点与下一结点值相同,则进一步处理
                if(pCur->next != NULL && pCur->next->val == pCur->val){
                    pNext = pCur->next;
                    
                    //找到pNext,它指向最后一个与pCur的val相同的结点,那pCur到pNext之间的结点都是要删除的
                    while(pNext->next != NULL && pNext->next->val == pCur->val)
                        pNext = pNext->next;
                    
                    //如果pCur指向链表中第一个元素,pCur -> ... -> pNext ->... , 要删除pCur到pNext, 将指向链表第一个元素的指针pHead指向pNext->next。
                    if(pCur == pHead)
                        pHead = pNext->next;
                    //如果pCur不指向链表中第一个元素,pPre -> pCur ->...->pNext ->... ,要删除pCur到pNext,即pPre->next = pNext->next
                    else
                        pPre->next = pNext->next;
                    //当前处理的p要向链表尾部移动
                    pCur = pNext->next;
                }
                //如果当前结点与下一结点值不同,更新pPre和pCur。
                else{
                    pPre = pCur;
                    pCur = pCur->next;
                }
            }
            return pHead;
        }
    };
    

    解题思路2

    //1. 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况
    //2.设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。
    if (pHead==null || pHead.next==null){return pHead;}
    ListNode Head = new ListNode(0);
    Head.next = pHead;
    ListNode pre  = Head;
    ListNode last = Head.next;
    while (last!=null){
        if(last.next!=null && last.val == last.next.val){
            // 找到最后的一个相同节点
            while (last.next!=null && last.val == last.next.val){
                last = last.next;
            }
            pre.next = last.next;
            last = last.next;
        }else{
            pre = pre.next;
            last = last.next;
        }
    }
    return Head.next;
    

    参考

    https://www.cnblogs.com/darlinFly/p/9328847.html

    相关文章

      网友评论

          本文标题:删除链表中重复的节点

          本文链接:https://www.haomeiwen.com/subject/fowfghtx.html