【剑指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;
}
};
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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】面试题57:删除链表中重复的结点
- 剑指offer面试题[57]-删除链表中重复的结点
- 【剑指Offer学习】【面试题57:删除链表中重复的结点】
- 剑指offer面试题57 删除链表中重复的结点
- 剑指offer 面试题57 删除链表中重复的结点
- 【剑指offer】题57:删除链表中的重复的结点
- 剑指Offer面试题57:删除重复链表 Java实现
- 剑指offer57 删除链表中重复的结点
- 剑指offer 删除链表中重复的结点
- 剑指offer57道题(删除链表中的重复结点)
- 剑指Offer面试题:12.在O(1)时间删除链表结点
- 剑指offer-面试题57:删除链表中重复的结点
- 剑指offer之面试题13在O(1)时间删除链表结点
- 剑指offer--面试题18:删除链表的结点
- 剑指offer-面试题57-删除链表中重复的结点
- 剑指Offer----面试题13:在O(1)时间删除链表结点
- 剑指offer-57:删除链表中重复节点
- 剑指offer面试题13——在O(1)时间删除链表结点
- 【剑指Offer】面试题13:在O(1)时间删除链表结点
- 剑指Offer面试题12打印1到最大的n位数,面试题13在O(1)时间删除链表结点