面试题57:删除链表中重复的结点
2015-05-03 17:56
357 查看
题目:在一个排序的链表中,如何删除重复的结点?例如将链表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,开始下一次循环
算法思路:设置三个指针
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; } } }
相关文章推荐
- 剑指offer--面试题57:删除链表中重复的结点
- 剑指Offer系列-面试题57:删除链表中重复的结点
- (剑指Offer)面试题57:删除链表中的重复结点
- 面试题57:删除链表中重复的结点
- 面试题57. 删除链表中重复的结点
- 【剑指Offer】面试题57:删除链表中重复的结点
- 【剑指Offer】面试题57:删除链表中重复的结点
- 剑指offer面试题[57]-删除链表中重复的结点
- 【剑指Offer学习】【面试题57:删除链表中重复的结点】
- 剑指offer 面试题57 删除链表中重复的结点
- 《剑指Offer》学习笔记--面试题57:删除链表中重复的结点
- 面试题57 删除链表中重复的结点
- 剑指offer面试题57 删除链表中重复的结点
- 剑指offer 面试题57 删除链表中重复的结点
- 剑指offer-面试题57:删除链表中重复的结点
- 剑指offer-面试题57-删除链表中重复的结点
- 《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!
- 《剑指offer》:[57]删除链表中重复的结点
- 剑指Offer面试题57:删除重复链表 Java实现
- 剑指offer57 删除链表中重复的结点