29. 删除链表中重复的节点

该篇博客介绍了一种解决方法,通过双指针遍历排序链表,删除重复节点。首先创建虚拟头节点,然后用两个指针pre和cur分别表示前一个节点和当前节点,统计连续重复节点的数量,若数量小于等于1,则保留,否则删除。最后返回虚拟节点的next作为新的链表头。

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

29. 删除链表中重复的节点

题目

在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留。

数据范围
链表中节点 val 值取值范围 [0,100]。
链表长度 [0,100]。

样例1
输入:1->2->3->3->4->4->5

输出:1->2->5
样例2
输入:1->1->1->2->3

输出:2->3

代码

  • 因为头节点都可能被删掉,所以创建一个虚拟头节点指向head,过程中就不用处理第一次插入节点时的判断操作,最终返回虚拟节点的next即可
  • 双指针遍历链表
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplication(ListNode* head) {
        if(!head || !head->next)return head;//如果链表为空或只有一个节点,则之间return head
        ListNode * pre = head, *cur = head, *ans = new ListNode(-1);//虚拟节点
        ListNode * tail = ans; //操作链表的尾指针
        while(cur){//当没有遍历到NULL时,一直遍历链表
            int cnt = 0;//统计pre和cur节点中有多少个重复的节点
            //当cur不为空并且前后指针的值相同时,一直移动cur指针并且cnt++
            while(cur && pre->val == cur->val)cur = cur->next, cnt++;
            if(cnt <= 1){//如果没有pre跟cur之间的节点值没有重复
                tail->next = pre;//把pre节点插入到tail后面
                tail = tail->next;//更新tail尾指针
                pre = cur;//把pre重新置于跟cur同一个位置
            }else{//如果有重复
                if(!cur)tail->next = NULL;//当此时是在链表末尾出现重复,则更新tail->next为NULL,下次再进入循环时cur为空会结束循环
                pre = cur;//把pre重新置于跟cur同一个位置
            }
        }
        return ans->next;//返回虚拟节点的next
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值