面试题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;}}}


0 0