描述
在一個(gè)排序的單鏈表中移除所有的重復(fù)元素词疼。
輸入:
? 1->2->3->3->4->4->5
返回
? 1->2->5
分析
變量
duplicated:記錄當(dāng)前是否在操作重復(fù)節(jié)點(diǎn);
cur : 指向當(dāng)前節(jié)點(diǎn)延赌;
prev : 指向當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)耽梅;
運(yùn)行
當(dāng)前節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)的下一個(gè)值進(jìn)行比較:
1薛窥,不相等,移動(dòng)指針指向眼姐,prev->next指向當(dāng)前節(jié)點(diǎn)cur诅迷,prev、cur移動(dòng)到下一個(gè)節(jié)點(diǎn)位置众旗;
2竟贯,相等,刪除掉cur節(jié)點(diǎn)逝钥,直到找到不相等的節(jié)點(diǎn)屑那,再刪除掉最后一個(gè)有相同值的節(jié)點(diǎn)拱镐,執(zhí)行第1步的移動(dòng)指針的操作。
實(shí)現(xiàn)
ListNode *removeAllDuplicatesFromSortedList(ListNode *head)
{
if (head == nullptr) {
return head;
}
ListNode dummy(INT_MIN);
dummy.next = head;
ListNode *prev = &dummy;
ListNode *cur = head;
while (cur != nullptr) {
bool duplicated = false;
while (cur->next!=nullptr && cur->val==cur->next->val) {
duplicated = true;
ListNode *temp = cur;
cur = cur->next;
delete temp;
}
if (duplicated) {
ListNode *temp = cur;
cur = cur->next;
delete temp;
continue;
}
prev->next = cur;
prev = prev->next;
cur = cur->next;
}
prev->next = cur;
return dummy.next;
}