Leetcode[鏈表] 83. 洗掉排序鏈表中的重復元素
- 審題
- 代碼實作
- 反思
審題
給定一個排序鏈表,洗掉所有重復的元素,使得每個元素只出現一次,
示例 1:
輸入: 1->1->2
輸出: 1->2
示例 2:
輸入: 1->1->2->3->3
輸出: 1->2->3
看到這道題,如果之前刷過陣列題的小伙伴,或者看過我的陣列專題,可能會感覺到很眼熟,這不就是陣列的洗掉重復元素的鏈表版嗎,因此,我們直接上代碼,雙指標走起,
代碼實作
方案一(上文提到的方法):
這里還是要多多注意特判,避免出現空指標錯誤,
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if ( head == NULL || head->next == NULL ) return head;
ListNode* res = head;
ListNode* f = head;
ListNode* l = head->next;
while ( l!=NULL ) {
while ( l!=NULL && f->val == l->val ) {
f->next = l->next;
l = l->next;
}
if ( l!=NULL ) {
f = f->next;
l = l->next;
}
}
return res;
}
};
方案2:
然而在看完題解的遞回思路之后,感覺到我們這個之前的代碼寫的還是不是很清晰,因此,仿寫代碼如下:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* cur = head;
while ( cur != NULL && cur->next != NULL ) {
if ( cur->val == cur->next->val ) {
cur->next = cur->next->next;
} else {
cur = cur->next;
}
}
return head;
}
};
對比兩段代碼,首先我們可以很明確地看見,他將兩個while做的事情,放在了一個while里,另外,程式正常結束的判定和特判,也可以放在一個while回圈里,總之,還是特別清晰就對了,也不用什么雙指標…哎,其實也算是吧,cur就是前指標,cur->next就是后指標,
反思
鏈表及雙指標的結合基本操作,需熟練掌握,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/225923.html
標籤:其他
