82. Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
分析
要求将链表中所有有重复出现的元素都删除,是这个题目的变形。在前面题目的基础上,删除后面重复元素后还要删除自身元素,所以需要加一个需要删除自身的标记。
源码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *pNode = head;
ListNode *pNext;
ListNode *prev = NULL;
ListNode *pHead = head;
bool shouldDeleteCurrent = false; // 用于标记是否要删除自身
while(pNode) {
pNext = pNode->next;
if(pNext && pNext->val == pNode->val) { // 1. 在后面找到和自己相等的先删除后面元素
shouldDeleteCurrent = true;
pNode->next = pNext->next;
delete pNext;
}else if(shouldDeleteCurrent) { // 2. 后面没有相等的元素了,判断是否需要删除自己
if(prev) { // 删除自己时需要判断当前是否链表头元素,prev存在说明不是链表头
prev->next = pNode->next;
delete pNode;
pNode = prev->next; // 删除自己后将当前节点后移一个,但是前面元素不变
} else { // prev为空说明是链表头元素,那删除自身后要将链表头元素移植下一个元素
pHead = pNode->next;
delete pNode;
pNode = pHead; // 当前节点后移
}
shouldDeleteCurrent = false;
} else { // 3. 没有相等元素则前移
prev = pNode;
pNode = pNode->next;
}
}
return pHead;
}
};