標籤:
題目:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
原始思路:儲存前一位的指標,這樣在重複的時候,可以直接用next指向新的位置,需要注意的是開始時候,需要進行額外的判斷是否有重複,才能形成錯位的指標。
原始代碼:
public class Solution { public ListNode deleteDuplicates(ListNode head) { ListNode req = head; ListNode pre = head; //判斷初始是否有重複 while(head != null){ head = head.next; // 直到沒有重複,head位於pre的下一位 if(head != null && pre.val == head.val){ do{ head = head.next; } while(head!=null && head.val == pre.val); pre = head; req = head; }else break; } //過程中判斷,pre始終在head前一位 while(head != null){ head = head.next; if(head!=null && pre.next.val == head.val){ do{ head = head.next; } while(head!=null && head.val == pre.next.val); pre.next = head; } else pre = pre.next; } return req; }}
修改思路:可以建立一個虛擬表頭,next指向head,這樣可以把原始代碼中初始部分的額外判斷最佳化掉,代碼十分簡潔。
修改後代碼:
public class Solution { public ListNode deleteDuplicates(ListNode head) { ListNode dunmy = new ListNode(Integer.MIN_VALUE); dunmy.next = head; ListNode pre = dunmy; while(head != null){ head = head.next; if(head!=null && pre.next.val == head.val){ do{ head = head.next; } while(head!=null && head.val == pre.next.val); pre.next = head; } else pre = pre.next; } return dunmy.next; }}
[LeetCode-JAVA] Remove Duplicates from Sorted List II 最佳化版