鍊錶的重複節點刪除

2021-10-09 02:40:28 字數 2021 閱讀 1276

【題目一】 力扣83  刪除重複的節點(保留重複的節點)

給定乙個排序鍊錶,刪除所有重複的元素,使得每個元素只出現一次。

示例 1:

輸入:1->1->2

輸出:1->2

示例 2:

輸入:1->1->2->3->3

輸出:1->2->3

【解法1】使用set去重,思路很簡單。時間複雜度o(n),空間複雜度o(n)

public static listnode deleterepeatednode1(listnode head) 

listnode cur = head.next;

listnode pre = head;

setset = new hashset<>();

set.add(head.val);// 保留第乙個節點

while(cur != null)else

cur = cur.next;

} return head;

}

【解法2】遍歷鍊錶,一次去重重複的節點。

方法二:類似選擇排序的過程,時間複雜度為 o(n2),額外空間複雜度為 o(1)。

public static listnode deleterepeatednode2(listnode head) else 

next = next.next;

}cur = cur.next;

} return head;

}

【題目兒】 力扣82  刪除重複的節點(不保留重複的節點)

給定乙個排序鍊錶,刪除所有含有重複數字的節點,只保留原始鍊錶中 沒有重複出現 的數字。(注意鍊錶已經排序了)

示例 1:

輸入:1->2->3->3->4->4->5

輸出:1->2->5

示例 2:

輸入:1->1->1->2->3

輸出:2->3

【解法一】使用map統計每個節點出現的次數

public static listnode deleterep1(listnode head)

cur = head;

while(cur!= null)else

cur = cur.next;

} return pre.next;

}

【解法二】使用雙指標,如果兩個指標指向的鍊錶值不相等時,兩個指標之間的距離大於0,就說明存在重複值,否則就沒有重複值。

這種情況只有乙個需要注意的地方就是temp節點更新的條件,只有len=0時才進行更新。(主要時考慮1-1-2-2-3這種情況,重複的資料的相連的,如1和2都需要刪除。)

public static listnode deleterep2(listnode head)

listnode pre = new listnode(-1);

pre.next = head;// 設定哨兵節點

listnode temp = pre;

listnode cur = head;

listnode next = cur.next;

int len = 0;// next節點和cur節點之間的距離,大於1則有重複節點

while (next != null)

if (len == 0) else

cur = next;

if (next != null) next = cur.next;//注意為節點的判斷

} return pre.next;

}

刪除鍊錶的重複節點

思路 就是找到不重複出現的節點,然後連線到新鍊錶上面 反思 在連線節點到新鍊錶的時候,每次都要把尾部節點的next指標設定為空!以防當前尾部節點真的是最後乙個節點卻沒給next設定指標域為空 struct listnode class solution listnode temp pnode 此時指...

鍊錶(刪除重複的節點)

題目要求 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 題解 先判空和長度是否為一 定義兩個指標和乙個傀儡節點 用cur當游標遍歷鍊錶,當cur的值和cur.next的值相等時,prev不動...

鍊錶 刪除鍊錶中重複的節點

刪除鍊錶中重複的節點 方法一 採用遞迴的方法,但這種方法在鍊錶無重複節點時效率不高 function deleteduplication phead if phead.val phead.next.val return deleteduplication node 採用遞迴的方法從下乙個不重複的點開...