【剑指offer】删除链表中重复的节点,C++实现(链表)
2024-08-29 02:19:06
0.简介
本文是牛客网《剑指offer》笔记。
1.题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
2.思路
链表有0个节点
链表有1个节点
链表有2个以上节点
三个指针和两层循环实现删除链表中重复的节点。
首先,检查边界条件(链表有0个节点或链表有1个节点)时,返回头结点;其次,避免由于第一个节点是重复节点而被删除,新建一个指向头结点的节点;再次,建立三个指针pre/p/next,分别指向当前节点的前序节点、当前节点、当前节点的后续节点;最后循环遍历整个链表,如果节点p的值和节点next的值相同,则删除节点p和节点next,pre和下一个没有重复的节点连接。如果节点p的值和节点next的值不同,则三个指针向后移动一个指针。
3.code
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
// 链表有0个/1个节点,返回第一个节点
if(pHead==NULL||pHead->next==NULL)
return pHead;
else
{
// 新建一个头节点,防止第一个结点被删除
ListNode* newHead=new ListNode(-1);
newHead->next=pHead; // 建立索引指针
ListNode* p=pHead; // 当前节点
ListNode* pre=newHead; // 当前节点的前序节点
ListNode* next=p->next; // 当前节点的后序节点 // 从头到尾遍历编标
while(p!=NULL && p->next!=NULL)
{
if(p->val==next->val)//如果当前节点的值和下一个节点的值相等
{
// 循环查找,找到与当前节点不同的节点
while(next!=NULL && next->val==p->val)
{
ListNode* temp=next;
next=next->next; // 删除内存中的重复节点
delete temp;
temp = nullptr; } pre->next=next;
p=next;
}
else//如果当前节点和下一个节点值不等,则向后移动一位
{
pre=p;
p=p->next;
}
next=p->next;
}
return newHead->next;//返回头结点的下一个节点
}
}
};
最新文章
- PAT 1043. 输出PATest(20)
- Android Sqlite 数据库版本更新
- notpad++安装python插件
- iOS开发-UISlider改变图片透明度
- 《Java虚拟机原理图解》 1.2、class文件里的常量池
- (八)Hibernate 映射关系
- python two-dimensional array assignment initialize
- PySide——Python图形化界面
- RS485中继器电路(转)
- 数据库ER图 PowerDesigner
- android仿漫画源码、抽奖转盘、Google相册、动画源码等
- [记]Debian alias 设置, 不设置貌似有点不方便习惯
- 一个特殊的SQL Server阻塞案例分析
- 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)
- 同时安装anaconda2和anaconda3
- Android 音视频深入 四 录视频MP4(附源码下载)
- Vue.nextTick和Vue.$nextTick
- CSS背景图片垂直居中center不起效果完美解决
- 软工网络15团队作业8——Beta阶段敏捷冲刺(day1)
- Vuejs+axios+SpringMVC 1