搜索
您的当前位置:首页正文

删除链表中重复的数字

来源:欧得旅游网

需要注意下,重复的数字可能是首字符,所在在开头增加一个空结点。

#include<iostream>
using namespace std;
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
    val(x), next(NULL) {
    }
};

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(!pHead)
            return pHead;
        int val = 0;
        ListNode * pFirst = new ListNode(val);
        pFirst->next = pHead;
        ListNode * pre = pFirst;
        pre->next = pHead;
        ListNode * p = pHead;
        while(p && p->next){

            if(p->val == p->next->val){

                while(p->next && (p->val == p->next->val))
                {
                    p = p->next;                        

                }    
                //删除重复的结点,利用前驱结点删除后继结点,一直删除到p结点之前,考虑p节点可能在末尾
                while(pre->next!=p){
                    ListNode* tmp = pre->next;
                    pre->next = pre->next->next;
                    delete tmp;
                }
                //删除p节点
                ListNode * tmp = pre->next;
                pre->next = pre->next->next;
                delete tmp;
                p = pre->next;//不能用p->next因为p已经被删了
            }
            else{  //相邻两个节点不相同
                //pre->next = p;
                pre = pre->next;   
                p = p->next;

            }

        }
        return pFirst->next;        

    }
};

int main(){

    ListNode *pHead = new ListNode(1);
    pHead->next = new ListNode(2);
    pHead->next->next = new ListNode(3);
    pHead->next->next->next = new ListNode(3);
    pHead->next->next->next->next = new ListNode(4);
    Solution s;
    ListNode * result=s.deleteDuplication(pHead);
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top