题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
思路:剑指offer上的思路
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
//输入空链表直接返回
if (pHead == NULL) return pHead;
ListNode* pPreNode = nullptr; //保存当前节点前一个节点
ListNode* pNode = pHead; //保存当前节点
while (pNode != nullptr) {
ListNode *pNext = pNode->next; //保存当前节点后一个节点
bool needDelete = false;
if (pNext != nullptr && pNext->val == pNode->val)
needDelete = true;
//若不需要删除,依次更新前一节点,当前节点,后一节点
if (!needDelete) {
pPreNode = pNode;
pNode = pNode->next;
} else {
int val = pNode->val;
ListNode* pToBeDel = pNode;
//若需要删除,从当前节点开始依次删除,直到节点值不重复
while (pToBeDel != nullptr && pToBeDel->val == val) {
pNext = pToBeDel->next;
delete pToBeDel;
pToBeDel = pNext;
}
//从头结点开始删除的情况
if (pPreNode == nullptr)
pHead = pNext;
else
pPreNode->next = pNext;//正常情况
pNode = pNext;
}
}
return pHead;
}
};