删除链表中的重复结点

来源:互联网 发布:淘宝鹤王阿胶糕是假货 编辑:程序博客网 时间:2024/04/29 09:49

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

思路
因为相同的结点全部都要删除,我们要设置三个指针,一个指向当前结点,一个指向前一结点,一个指向下一结点,一旦遇到当前结点等于下一结点的情况,那么就一直移动,直到遇到下一个结点不同的状况,再将前一个结点指向此时结点的位置。

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
classSolution
{
    public:
        ListNode* deleteDuplication(ListNode* pHead)
        {
            if(pHead==nullptr)
                returnpHead;
            ListNode *pPreNode = nullptr;
            ListNode *pNode = pHead;
            while(pNode!=nullptr)
            {
                ListNode *pNextNode = pNode->next;
                bool needDelete = false;
                if(pNextNode!=nullptr && pNode->val==pNextNode->val)
                    needDelete = true;
                if(!needDelete)
                {
                    pPreNode = pNode;
                    pNode = pNode->next;
                }
                else
                {
                    intvalue = pNode->val;
                    ListNode *pToBeDel = pNode;
                    while(pToBeDel!=nullptr && pToBeDel->val == value)
                    {
                        pNextNode = pToBeDel->next;
                        delete pToBeDel;
                        pToBeDel = nullptr;
                        pToBeDel = pNextNode;
                    }
                    if(pPreNode==nullptr)
                        pHead = pNextNode;
                    else
                        pPreNode->next = pNextNode;
                    pNode = pNextNode;
                }
            }
            returnpHead;
        }
};
0 0
原创粉丝点击