/*
题目:
删除链表中重复的节点
*/
/*
思路:
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;
}
}

  

最新文章

  1. Restful资源文章
  2. NFC
  3. SDUTOJ 3312
  4. Linux跨用户copy文件
  5. ApexSql Log 2014.04.1133破解版&amp;补丁
  6. 倔强的网站数据抓取,关键时刻还需Webbrowser显身手
  7. Spring JDBC保存枚举对象含关键字报错原因之一
  8. ASP.Net MVC中数据库数据导出Excel,供HTTP下载(转)
  9. Java 简单登录MVC
  10. Web应用的组件化(二)
  11. MAC——laravel环境
  12. jQuery绑定事件的四种基本方式
  13. laydate天蓝色的皮肤
  14. How to install PL/SQL developer on linux (转)
  15. 九度OJ 1205 N阶楼梯上楼问题 (DP)
  16. 关于from nltk.book import * 报错解决方法
  17. 导航菜单点击图片切换--jquery
  18. python 约束与异常处理
  19. uva11426 欧拉函数应用,kuangbin的筛法模板
  20. Linux 常见操作

热门文章

  1. Go语言实现:【剑指offer】二叉树的深度
  2. ibtmp1文件过大
  3. zabbix-proxy配置文件参数说明
  4. typescript 点滴
  5. 进阶之路 | 奇妙的Window之旅
  6. springcloud vue.js 微服务 分布式 activiti工作流 前后分离 shiro权限 集成代码生成器
  7. 05.JS函数
  8. SAP 事务代码 ME31K 报错 - 不含来自带工厂分配的供应商的物料的采购没有被定义 -
  9. Xcode-一些小问题(配置包路径,配置文件路径。。。)
  10. Spark组件间通信