删除链表中重复节点

该博客讨论了如何在已排序的链表中删除所有重复的节点,以保留唯一的值。提供了两种解题方法,一种是通过创建伪头结点和迭代来实现,另一种是使用递归的方式进行节点调整。每种方法都包含详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

给定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);
            }
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值