剑指offer-面试题18-删除链表中重复的节点-链表
2024-10-08 09:16:02
/*
题目:
删除链表中重复的节点
*/
/*
思路:
1、声明一个头节点head,即使首元节点被删除,也可返回head->next
2、声明两个指针,
一个指针qNode指向确定不会删除的链表的最后一个节点,
一个指针pNode指向遍历的节点。
3、记录前一个节点的preVal,直到找到与preVal不同的节点,删除中间节点。
4、声明一个flag,指示当前节点之前的节点是否为重复节点。
*/ #include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std; struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
}; ListNode* deleteDuplication(ListNode* pHead)
{
//当链表长度为0或1时
if(!pHead || !(pHead->next)) return pHead; //声明头节点,统一操作
ListNode* head = new ListNode(0);
head->next = pHead;
int preVal = pHead->val;
ListNode* qNode = head;//已确认的节点
ListNode* pNode = pHead->next;//工作节点
bool flag = false;
while(pNode){
if(pNode->val != preVal){
if(flag){
ListNode* deleteNode = qNode->next;
ListNode* temp = nullptr;
while(deleteNode != pNode){
temp = deleteNode->next;
delete deleteNode;
deleteNode = temp;
}
flag = false;
qNode->next = pNode;
}else{
while(qNode->next != pNode){
qNode = qNode->next;
}
}
preVal = pNode->val;
}else{
flag = true;
}
pNode = pNode->next;
}
if(flag){
ListNode* toBeDelete = qNode->next;
qNode->next = nullptr;
ListNode* temp = nullptr;
while(toBeDelete){
temp = toBeDelete->next;
delete toBeDelete;
toBeDelete = temp;
}
}
return head->next;
} int main(){
ListNode* node1 = new ListNode(2);
ListNode* node2 = new ListNode(1);
ListNode* node3 = new ListNode(1);
node1->next = node2;
node2->next = node3;
ListNode* head = deleteDuplication(node1);
while(head){
cout<<head->val<<" ";
head = head->next;
}
}
最新文章
- Restful资源文章
- NFC
- SDUTOJ 3312
- Linux跨用户copy文件
- ApexSql Log 2014.04.1133破解版&;补丁
- 倔强的网站数据抓取,关键时刻还需Webbrowser显身手
- Spring JDBC保存枚举对象含关键字报错原因之一
- ASP.Net MVC中数据库数据导出Excel,供HTTP下载(转)
- Java 简单登录MVC
- Web应用的组件化(二)
- MAC——laravel环境
- jQuery绑定事件的四种基本方式
- laydate天蓝色的皮肤
- How to install PL/SQL developer on linux (转)
- 九度OJ 1205 N阶楼梯上楼问题 (DP)
- 关于from nltk.book import * 报错解决方法
- 导航菜单点击图片切换--jquery
- python 约束与异常处理
- uva11426 欧拉函数应用,kuangbin的筛法模板
- Linux 常见操作