《剑指offer》刷题笔记5
- 学习内容
删除链表中重复的结点
(1)思路
使用三个指针。一个指向当前结点的最晚被访问不重复结点。一个指向当前结点。一个指向当前结点的最后一个重复结点。当前结点的下一个结点可能是重复结点、新结点(也就是不重复结点)、空。如果当前结点的下一个结点是重复结点,那么找到它最后一个重复的结点记作pNext。如果当前结点的下一个结点是空结点或者新结点,那就更新当前结点和当前结点的最晚被访问的不重复结点。
(2)代码
/*
struct ListNode {
int val;
struct ListNode next;
ListNode(int x) :
val(x), next(NULL) {
}
};
/
class Solution {
public:
ListNode deleteDuplication(ListNode pHead)
{
ListNode* pPre=NULL;//最晚被访问的不重复结点
ListNode* pNode=pHead;//当前结点
ListNode* pNext=NULL;//与当前结点值相同的最后一个重复结点
while(pNode!=NULL)
{ //当前结点的下一个结点是重复结点
if(pNode->next!=NULL && pNode->val==pNode->next->val)
{
pNext=pNode->next;
while(pNext->next!=NULL && pNext->val==pNext->next->val)
{
pNext=pNext->next;
}
if(pNode==pHead)
{
pHead=pNext->next;
}
else
{
pPre->next=pNext->next;
}
//下一个不重复结点
pNode=pNext->next;
}
//当前结点的下一个结点是空或者不是重复结点
else
{
pPre=pNode;
pNode=pNode->next;
}
}
return pHead;
}