剑指offer:删除链表中重复的结点
2024-10-20 13:51:10
题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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。
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==nullptr || pHead->next==nullptr)
return pHead;
else
{
ListNode* newhead = new ListNode(-);
newhead->next = pHead;
ListNode* pre=newhead;
ListNode* cur=pHead;
ListNode* nex=pHead->next;
while(cur!=nullptr && cur->next!=nullptr)
{
if(cur->val==nex->val)
{
while(nex!=nullptr && cur->val==nex->val)
{
ListNode* tmp = nex;
nex = nex->next; delete tmp;
tmp = nullptr;
}
pre->next = nex;
cur = nex;
}
else
{
pre = cur;
cur = cur->next;
}
nex = nex->next;
}
return newhead->next;
}
}
};
最新文章
- js中typeof的使用方法
- java 字符串zlib压缩/解压
- Javascript杂记(一)
- IOS第七天(5:UiTableView 汽车品牌,复杂模型分组展示,A-Z索要列表) (2015-08-05 14:03)
- Tomcat不能自动编译JSP文件问题的一种解决方法
- Spring 依赖注入,在Main方法中取得Spring控制的实例
- Linux- Bond
- JAVA 主函数(主方法)
- C# DES 加密 解密
- 使用spring @Scheduled注解执行定时任务
- iOS开发-轻点、触摸和手势
- PHP将二进制文件存入数据库以及从数据库中读取二进制文件
- bzoj1922
- Android读取Manifest文件下Application等节点下的metadata自定义数据
- 亲测linux 上安装php
- 读懂IL代码(一)
- 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单
- 全新 Kali Linux 系统安装指南
- Linux下yum安装MySQL yum安装MySQL指定版本
- Immutable 学习