56.删除链表中重复的结点

题目描述

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


思路一(非递归):

先设置一个虚拟结点dummy,使dummy->next = pHead,设置last指针指向dummy,令指针p从链表头开始遍历,当p和p->next的值相等时,用while循环让p指向连续相等的数的末尾的后一位,此时让last指向p,并继续外层循环,当p和p->next不相等时,此时可以确定p所指结点可以保留,则让last指向p,p指向p->next。


代码一:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        ListNode* dummy = new ListNode(-1);
        dummy->next = pHead;
        ListNode *last, *p;
        p = pHead;
        last = dummy;
        while(p != NULL && p->next != NULL) {
            if(p->val == p->next->val) {
                int val = p->val;
                while(p != NULL && p->val == val) {
                    p = p->next;
                }
                last->next = p;  //此时还不能令last=p,因为任然不清楚p和p->next是否相同
            } else {
                last = p;
                p = p->next;
            }
        }
        return dummy->next;
    }
};

思路二(递归版):

对pHead和pHead->next进行判断,若取值相等,则用while循环找到第一个不等的结点cur,则返回deleteDuplication(cur);若取值不等,则令pHead->next = deleteDuplication(pHead->next),继续递归求解;在递归时需要在初始位置判断递归结束的条件,pHead == NULL返回NULL,pHead != NULL && pHead->next == NULL 返回pHead。

代码二:

/*
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;
        if(pHead != NULL && pHead->next == NULL) return pHead;
        ListNode *cur;
        if(pHead->val == pHead->next->val) {
            cur = pHead->next->next;
            while(cur != NULL && cur->val == pHead->val) {
                cur = cur->next;
            }
            return deleteDuplication(cur);
        } else {
            pHead->next = deleteDuplication(pHead->next);
            return pHead;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/nichchen/article/details/80520762