劍指56.刪除連結串列中重複的結點
阿新 • • 發佈:2020-09-06
題目描述
在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5思路
思路1:雙指標非遞迴法。本題目的關鍵是要考慮到多種測試用例,例如重複的結點位於連結串列頭部、中間、尾部。
思路2:遞迴法。
☆☆解法1.1
public class Solution { public ListNode deleteDuplication(ListNode pHead) { if (pHead == null) return null; ListNode pre = null; ListNode cur = pHead; while (cur != null){ if (cur.next != null && cur.val == cur.next.val){ while (cur.next != null && cur.val == cur.next.val){ cur = cur.next; } cur= cur.next; if (pre == null){ pHead = cur; }else{ pre.next = cur; } }else{ pre = cur; cur = cur.next; } } return pHead; } }
☆☆解法1.2(使用虛擬頭節點)
public class Solution { public ListNode deleteDuplication(ListNode pHead) { if (pHead == null || pHead.next == null){ return pHead; } ListNode head = new ListNode(-1); head.next = pHead; ListNode pre = head; ListNode cur = head.next; while (cur != null){ if (cur.next != null && cur.val == cur.next.val){ while (cur.next != null && cur.val == cur.next.val){ cur = cur.next; } cur = cur.next; pre.next = cur; }else{ pre = pre.next; cur = cur.next; } } return head.next; // 虛擬頭節點的下一個才是真實頭節點 } }