問題:
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.
大意:
給出一個(gè)排好序的鏈表茵瀑,刪除所有的重復(fù)的數(shù)字看成,讓每個(gè)元素只出現(xiàn)一次。
比如:
給出 1->1->2, 返回1->2.
給出1->1->2->3->3, 返回1->2->3.
思路:
既然鏈表本身已經(jīng)排好序了,那么只用比較當(dāng)前位置的值和next的值是否一樣,一樣就把next指向下一個(gè)再繼續(xù)判斷就好了玄糟,思路還是比較簡(jiǎn)單磷籍,但是有幾個(gè)容易忽略的點(diǎn)需要注意。
- 首先是首節(jié)點(diǎn)為空的情況要考慮挤渐;
- 其次是只有當(dāng)當(dāng)前數(shù)字和下一個(gè)數(shù)字不一樣時(shí)才把操作的節(jié)點(diǎn)換成下一個(gè)節(jié)點(diǎn)去繼續(xù)向后操作苹享,因?yàn)橛锌赡苡卸鄠€(gè)重復(fù)的數(shù)字串在一起,不能刪除一個(gè)節(jié)點(diǎn)后就直接往后移進(jìn)行判斷浴麻,要判斷刪了一個(gè)以后下一個(gè)是否還是一樣得问;
- 如果鏈表的最后幾個(gè)數(shù)字都是重復(fù)的,我們?cè)跈z測(cè)到重復(fù)的數(shù)字時(shí)會(huì)刪除它然后將當(dāng)前節(jié)點(diǎn)的next指向next的next软免,但是這里要注意判斷next是否還有next宫纬,如果沒有卻進(jìn)行操作,那就會(huì)出錯(cuò)了膏萧。
在自己檢測(cè)時(shí)可以試試代碼對(duì)下面幾個(gè)測(cè)試用例是否能通過:
- []
- [1,1]
- [1,1,2]
- [1,1,1]
代碼(Java):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) return head;
ListNode p = head;
while (p.next != null) {
ListNode q = p.next;
if (q.val == p.val) {
if (q.next != null) {
p.next = q.next;
}
else p.next = null;
}
else p = p.next;
}
return head;
}
}
代碼(C++)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
while(true) {
if (head->next == nullptr) break;
if (head->val == head->next->val) {
head->next = head->next->next;
} else {
break;
}
}
deleteDuplicates(head->next);
return head;
}
};
合集:https://github.com/Cloudox/LeetCode-Record