题目描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
输入: 1->2->3->3->4->4->5
输出: 1->2->5
解题思路
《剑指offer》第18题,链表题大多还是用“多指针”解决,一般都不会很难,注意不要断链就好。
参考代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* pHead)
{
if(pHead == nullptr)
return nullptr;
ListNode* dummyHead = new ListNode(-1);
dummyHead->next = pHead;
ListNode* pPre = dummyHead;
ListNode* pNode = dummyHead->next;
while(pNode != nullptr){
ListNode* pNext = pNode -> next;
bool toBeDeleted = false;
if(pNext != nullptr && pNode->val == pNext->val)
toBeDeleted = true;
if(!toBeDeleted){
pPre = pNode;
pNode = pNext;
}else{
int duplication = pNode->val;
ListNode* deleteNode = pNode;
while(deleteNode->val == duplication){ // 这个while卡了好久,没有仔细考虑清楚。
pNext = deleteNode->next;
delete deleteNode;
// deleteNode = nullptr;
deleteNode = pNext;
if(pNext == nullptr)
break;
}
pPre->next = pNext;
pNode = pNext;
}
}
return dummyHead->next;
}
};