剑指offer:删除链表中重复的结点

博客围绕排序链表中删除重复结点的问题展开。先给出题目,如链表1->2->3->3->4->4->5处理后为1->2->5。思路上考虑结点数为0或1和两个及以上两种情况,后者用pre、cur、nex三个指针解决,还给出代码来源。

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

题目描述:

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

 

思路分析:

要考虑两种情况,链表中结点为0或1,此时直接返回原链表;第二种情况就是链表中包含两个及以上的结点。

解决第一种情况直接进行一个判断即可,第二种情况,需要定义三个指针pre, cur, nex来解决。其中为了最终返回链表头指针,需要额外定义一个指针,指向链表头。这里定义这个指针为newhead,newhead的next为给定链表的头。接下来令pre指向newhead,cur指向pHead,nex指向pHead->next。接下来进行判断,当cur->val==nex->val时,继续向后循环遍历,直到nex->val大于cur->val,此时pre->next=nex;当cur->val<nex->val时,即满足条件,向后继续遍历,那么pre=cur, cur=cur->next。

 

代码:

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6         val(x), next(NULL) {
 7     }
 8 };
 9 */
10 class Solution {
11 public:
12     ListNode* deleteDuplication(ListNode* pHead)
13     {
14         if(pHead==nullptr || pHead->next==nullptr)
15             return pHead;
16         else
17         {
18             ListNode* newhead = new ListNode(-1);
19             newhead->next = pHead;
20             ListNode* pre=newhead;
21             ListNode* cur=pHead;
22             ListNode* nex=pHead->next;
23             while(cur!=nullptr && cur->next!=nullptr)
24             {
25                 if(cur->val==nex->val)
26                 {
27                     while(nex!=nullptr && cur->val==nex->val)
28                     {
29                         ListNode* tmp = nex;
30                         nex = nex->next;
31 
32                         delete tmp;
33                         tmp = nullptr;
34                     }
35                     pre->next = nex;
36                     cur = nex;
37                 }
38                 else
39                 {
40                     pre = cur;
41                     cur = cur->next;
42                 }
43                 nex = nex->next;
44             }
45             return newhead->next;
46         }
47     }
48 };

 

转载于:https://www.cnblogs.com/LJ-LJ/p/11066936.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值