删除链表中重复节点

题目描述

给定一个已排序的链表,删除所有具有重复数字的节点,只保留与原始链表不同的数字。例如,

给定1 - > 2 - > 3 - > 3 - > 4 - > 4 - > 5,返回1 - > 2 - > 5。

给定1 - > 1 - > 1 - > 2 - > 3,返回2 - > 3。

解题思路1

(1)添加一个新的节点作为伪头结点,最后返回伪头结点的next即可

(2)遍历整个链表,遇到当前节点与其next节点的值相同,则不向新建节点后添加,否则添加到新建节点之后,按顺序依次添加

代码示例

class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        if (head == NULL) return NULL;
        ListNode *preHead = new ListNode(0);
        preHead->next = head;
        ListNode *cur = preHead;
        while (cur->next && cur->next->next) {//注意循环条件,缺一不可
            ListNode *pre = cur->next;
            ListNode *pnext = pre->next;
            if (pre->val != pnext->val) {
                cur->next = pre;
                cur = pre;
            }
            else {
                while (pnext && pre->val == pnext->val) {//注意循环条件,缺一不可
                    pnext = pnext->next;
                }
                cur->next = pnext;
            }
        }
        return preHead->next;
        
    }

};

解题思路2

不新增节点,采用递归方式调整节点

代码示例

class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        if (head == NULL || head->next == NULL) return head;
            if (head->val != head->next->val) {
                head->next = deleteDuplicates(head->next);
                return head;
            } else {
                int tmp = head->val;
                while (head->val == tmp) {
                    head = head->next;
                    if (!head) {
                        return NULL;
                    }
                }
                return deleteDuplicates(head);
            }
    }
};

猜你喜欢

转载自blog.csdn.net/summer00072/article/details/80948697
今日推荐