链表删除重复元素1,删除重复元素2,

本文介绍两种删除排序链表中重复元素的方法:一种是移除所有重复元素仅保留首次出现的元素;另一种则完全移除所有重复数字的节点。通过使用额外的指针和循环逻辑实现这些操作。

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

  1. 删除排序链表中的重复元素
    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2
示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

思路:很简单。先将两个指针进行操作,start,end然后判断end是否等于空即可

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode node=ListNode(-1);
        ListNode * dummpy=&node;
        dummpy->next=head;

        
        ListNode* start,*end;
        start=head;
        if(head==NULL)
        {
            return NULL;
        }
        end=start->next;

        while(end!=NULL)
        {
            if(start->val==end->val)
            {
                ListNode * tempNode=end;
                end=end->next;

                delete tempNode;
                start->next=end;
            }
            else
            {
                start=end;
                end=end->next;
            }

        }
        return dummpy->next;
        
    }
};
  1. 删除排序链表中的重复元素 II
    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:

输入: 1->1->1->2->3
输出: 2->3

思路
链表操作最多四个指针 ,pre,start,end,next (next依赖于end)(end依赖于start)

首先将start指向链表第一个节点 ,while循环条件判断start是否为空 然后判断start->val==start->next->val 如果成立就会执行操作的是start向后移动,不过我们因该在条件中加入start!=null&&start->next!=null

如果pre->next!=start 就代表着中间有重复元素,采用方法一对链表进行操作
否则 采用方法二对链表进行操作(方法一方法二都在链表中)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode node(-1);
        ListNode *dummty=&node;
        dummty->next=head;

        ListNode *pre,*start;
        pre=dummty;
        start=dummty->next;;
        while(start!=NULL)
        {
            while(start!=NULL&&start->next!=NULL&&start->val==start->next->val)
            {
                // auto p=start;
                start=start->next;
                
                // cout<<"删除了节点是"<<p->val<<endl;
                // delete p;

            }

           
            if(pre->next!=start)//存在重复文件
            {
                
                pre->next=start->next;

                // auto p=start;

                start=start->next;

                // cout<<"删除了节点是"<<p->val<<endl;
                // delete p;

                

            }else//   注意这里不能写成  else if(pre->next==start)   因为由于前面对pre进行了改变
            {
                pre=start;
                start=start->next;
            }
           

        }
        return dummty->next;
        
        
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值