題目地址:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
題目:
給定一個(gè)排序鏈表汇竭,刪除所有含有重復(fù)數(shù)字的節(jié)點(diǎn)壶熏,只保留原始鏈表中 沒有重復(fù)出現(xiàn) 的數(shù)字拳喻。
示例 1:
輸入: 1->2->3->3->4->4->5
輸出: 1->2->5
試題分析:
該題核心的思路是掃描到節(jié)點(diǎn)后內(nèi)部嵌套一個(gè)循環(huán)繼續(xù)往后遍歷拙已,因?yàn)殒湵硎怯行虻模员闅v到節(jié)點(diǎn)值不相等即可停止修改鏈表連接,一次性將中間重復(fù)的元素刪除就完成了重復(fù)元素的刪除,整個(gè)的時(shí)間復(fù)雜度為O(n),雖然在外循環(huán)內(nèi)部嵌套了一個(gè)循環(huán)憨闰,但是因?yàn)殒湵硎怯行虻模瑑?nèi)部不會(huì)出現(xiàn)再次重復(fù)循環(huán)需五。因?yàn)榭赡軙?huì)對(duì)頭節(jié)點(diǎn)有刪除操作鹉动,所以新建了空頭節(jié)點(diǎn),并記錄刪除節(jié)點(diǎn)前置指針用于刪除重復(fù)節(jié)點(diǎn)使用宏邮。
代碼:
public ListNode deleteDuplicates(ListNode head) {
ListNode newHead = new ListNode(-1);
newHead.next = head;
ListNode pre = newHead;
if(head==null || head.next==null){
return head;
}
ListNode cur = head;
while(cur!=null){
boolean duplicate = false;
while(cur.next!=null && cur.val==cur.next.val) {
//對(duì)重復(fù)數(shù)字進(jìn)行循環(huán)刪除
duplicate = true;
cur = cur.next;
}
//刪除最后一個(gè)重復(fù)節(jié)點(diǎn)
if(duplicate){
pre.next = cur.next;
}else {
pre.next = cur;
pre = cur;
}
cur = cur.next;
}
return newHead.next;
}
源碼路徑:com.monkey01.linkedlist.RemoveDuplicatesFromSortedListII_82
配套測(cè)試代碼路徑:test目錄com.monkey01.linkedlist.RemoveDuplicatesFromSortedListII_82Test