题目描述:

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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;
}
}
};

最新文章

  1. js中typeof的使用方法
  2. java 字符串zlib压缩/解压
  3. Javascript杂记(一)
  4. IOS第七天(5:UiTableView 汽车品牌,复杂模型分组展示,A-Z索要列表) (2015-08-05 14:03)
  5. Tomcat不能自动编译JSP文件问题的一种解决方法
  6. Spring 依赖注入,在Main方法中取得Spring控制的实例
  7. Linux- Bond
  8. JAVA 主函数(主方法)
  9. C# DES 加密 解密
  10. 使用spring @Scheduled注解执行定时任务
  11. iOS开发-轻点、触摸和手势
  12. PHP将二进制文件存入数据库以及从数据库中读取二进制文件
  13. bzoj1922
  14. Android读取Manifest文件下Application等节点下的metadata自定义数据
  15. 亲测linux 上安装php
  16. 读懂IL代码(一)
  17. 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单
  18. 全新 Kali Linux 系统安装指南
  19. Linux下yum安装MySQL yum安装MySQL指定版本
  20. Immutable 学习

热门文章

  1. react性能优化要点
  2. 十二、vue中watch原理
  3. 笔谈kxmovie开源播放器库的使用
  4. SpringBoot上传文件报错,临时路径不存在
  5. 直播知识-推流&amp;拉流
  6. scrapy 爬虫中间件 deepth深度
  7. Flask项目-循环导入及蓝图
  8. VS Code好用到飞起的配置设置
  9. 使用opencv去操作树莓派摄像头保存图片和视频
  10. ETL工程师笔试题