您的位置:首页 > 编程语言 > C语言/C++

剑指offer(c++)——删除链表中重复的结点

2017-04-18 15:16 411 查看


题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 

例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :val(x), next(NULL) {}
};

/*思路:从头到尾遍历链表,如果当前结点与下一个结点值相同,它们就是重复结点,都被删除。为了保证删除之后链表没有
从中间断开,需要把当前结点的前一个结点(pPreNode)和后面不重复的第一个结点(pNext)相连。同时注意头结点有可能也会被删除*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead == NULL)
return NULL;
ListNode* pNewHead = new ListNode(-1);              //申请一个新的头结点,防止原头结点重复,被删除
pNewHead->next = pHead;
ListNode* pPreNode = pNewHead;                      //始终指向要删除结点的前一个结点
ListNode* pNode = pHead;                            //用来寻找要删除的结点
ListNode* pNext = NULL;                             //始终指向删除结点的后一个结点,防止链表断开
while (pNode != NULL&&pNode->next != NULL)
{
pNext = pNode->next;
if (pNode->val == pNext->val)                                     //如果有重复结点
{
while (pNext != NULL&&pNext->val == pNode->val)           //找到重复结点后的第一个不重复结点
pNext = pNext->next;
pPreNode->next = pNext;                                   //删除重复结点
pNode = pNext;
}
else
{
pPreNode = pNode;
pNode = pNode->next;
}
}
return pNewHead->next;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息