您的位置:首页 > 职场人生

面试题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,开始下一次循环

#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;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: