面试题57:删除链表中重复的结点
来源:互联网 发布:28自动挂机软件 编辑:程序博客网 时间:2024/06/05 08:07
题目:在一个排序的链表中,如何删除重复的结点?例如将链表1-2-3-3-4-4-5变为1-2-5
算法思路:设置三个指针
preNode:指向要删除结点的前一个结点,初始化为NULL
pNode:指向当前遍历的结点
pNext:指向当前结点的下一个结点
1.pNode指向头结点,开始遍历链表
2.第一步将pNext=pNode->next,指向当前结点的下一个结点,判断当前结点的值和下一个结点的值是否相等
3.如果不相等,needDelete设为false,即不需要删除,向下进行,让preNode指向当前结点,当前结点指向下一个结点pNode=pNode->next,再次开始判断
4.如果相等,needDelete设为true,记录当前结点的值放入变量value中,设置一个新的指针tobedelete指向当前结点
5.判断tobedelete是否为空并且指向结点的值是否和value相等,相等的话pnext指向tobedelete的下一个结点,并将tobedelete指向结点删除,然后让tobedelete=pnext,即开始判断下一个结点是否要删除,再次循环判断tobedelelte是否为空并且指向结点的值是否和value相等,如果还是相等重复删除的步骤,直到下一个结点的值不和value相等
6.下一个结点的值不为value时while循环结束,因为有可能头结点被删除,所以要先判断preNode是否为空,为空的时候说明头结点被删除,将头结点设为pNext
7.如果头结点没有被删除,将第一个被删除结点之前的结点preNode的下一个结点设为pNext
8.最后将当前结点设为pnext,开始下一次循环
#include <iostream>using namespace std;struct ListNode {int value;ListNode * next;};//因为头结点可能被删除值被改变,所以使用二级指针void deleteDuplication(ListNode** pHead){if(pHead==NULL||*pHead==NULL)return;ListNode * preNode=NULL;//记录当前遍历结点的前一个结点ListNode * pNode =*pHead;//当前结点while(pNode!=NULL){ListNode * pNext=pNode->next;//当前结点的下一个结点bool needDelete=false;//如果当前结点的值和下一个结点的值相同说明需要删除if(pNext!=NULL&&pNext->value==pNode->value){needDelete=true;}//不需要删除的时候if(!needDelete){preNode=pNode;//记录当前结点pNode=pNode->next;//向下遍历}else//需要删除时{int value=pNode->value;//记录当前结点的值ListNode * pToBeDel=pNode;//记录当前结点while(pToBeDel!=NULL&&pToBeDel->value==value){pNext=pToBeDel->next;//pnext指向要删除结点的下一个结点delete pToBeDel;//当前结点删除pToBeDel=pNext;//判断下一个结点}if(preNode==NULL)//判断头结点是否被删除,如果被删除preNode为空{*pHead=pNext;}else{preNode->next=pNext;}pNode=pNext;}}}
- 面试题57:删除链表中重复的结点
- 剑指offer-面试题57:删除链表中重复的结点
- 剑指offer--面试题57:删除链表中重复的结点
- 剑指offer 面试题57 删除链表中重复的结点
- 剑指offer-面试题57-删除链表中重复的结点
- 剑指offer 面试题57 删除链表中重复的结点
- 面试题57:删除链表中重复的结点
- 【剑指Offer】面试题57:删除链表中重复的结点
- 剑指offer面试题57 删除链表中重复的结点
- 剑指offer面试题[57]-删除链表中重复的结点
- 【剑指Offer】面试题57:删除链表中重复的结点
- 面试题57. 删除链表中重复的结点
- 《剑指Offer》学习笔记--面试题57:删除链表中重复的结点
- 【剑指Offer学习】【面试题57:删除链表中重复的结点】
- 剑指Offer系列-面试题57:删除链表中重复的结点
- 《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!
- 《剑指Offer》面试题57:删除链表中重复的节点
- 删除链表中重复的结点
- Lunch Time
- mysql允许远程连接
- 【字符编码系列之二】国内中文编码标准简介
- Linux下安装软件的一般步骤
- 数学之美--笔记6
- 面试题57:删除链表中重复的结点
- cocos2dx 坐标转换相关函数应用演示
- 李开复给中国大学生的第四封信—大学四年应是这样度过
- 设计模式分类
- 李开复给中国大学生的第五封信—写给中国家长的一封信
- OC05核心语法总结 2
- 数据流图——三次求精
- vs配置opencv问题
- 多台Mac电脑使用同一个苹果开发者帐号进行调试