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

【剑指Offer】面试题57:删除链表中重复的结点

2017-07-17 15:45 330 查看
一:题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

二:解题思路

从头到尾遍历链表,如果当前结点的值和下一个节点的值相同,那么他们就是重复的结点,都可以被删除。

为保证删除之后的链表仍然是相连没有断开,我们把当前节点的前一个结点和后面值比当前节点的值大的结点相连。

三:代码实现

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
//边界条件:空或者只包括一个结点,直接返回
if(pHead==NULL || (pHead!=NULL && pHead->next==NULL))
return pHead;

ListNode* pPreNode=NULL; //发生重复结点的前一个结点
ListNode* pNode=pHead;

while(pNode!=NULL){
ListNode* pNext=pNode->next;

bool needDelete=false; //是否发生重复
if(pNext!=NULL && pNext->val==pNode->val)
needDelete=true;

//未发生重复,遍历下一个节点,记录pPreNode
if(!needDelete){
pPreNode=pNode;
pNode=pNode->next;
}
else{
//发生重复
int value=pNode->val;//记录重复值

ListNode* pToBeDel=pNode; //记录要删除的结点

//删除重复的结点
while(pToBeDel!=NULL && pToBeDel->val==value){
pNext=pToBeDel->next;

delete pToBeDel;
pToBeDel=NULL;
pToBeDel=pNext;
}

//头结点是重复的结点
if(pPreNode==NULL)
pHead=pNext;
else
pPreNode->next=pNext;

pNode=pNext;
}
}

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