1. 程式人生 > 其它 >演算法之小細節(細節~連結串列的特殊結點~提升優化度)~反轉連結串列、刪除排序連結串列中的重複元素

演算法之小細節(細節~連結串列的特殊結點~提升優化度)~反轉連結串列、刪除排序連結串列中的重複元素

演算法之小細節(細節~連結串列的特殊結點~提升優化度)~刪除排序連結串列中的重複元素、反轉連結串列

1,刪除排序連結串列中的重複元素

(1)細節優化度高的程式碼:

  public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        } else {
      // head.next 用得好 head.next
= deleteDuplicates(head.next);
       //因為 是已經排序的連結串列,頭結點即最小,只需要比較head 與新連結串列的頭結點(head.next)就夠了
return head.val == head.next.val ? head.next:head; } }

(2)自己寫的 程式碼哈哈哈:

    public ListNode deleteDuplicates(ListNode head) {
        // 頭為空,或 只有一個頭結點時
        if (head == null || head.next == null)
            return head;
        // 遞迴得到頭之後的連結串列        
        ListNode pre = deleteDuplicates(head.next);
        
if(pre == null) return head; // 或者連結串列只有一個頭結點時 if (pre.next == null) { if (pre.val == head.val) { //解釋一下,為什麼不能return head; //若 return head; 的話,而原來head 還指著老鏈條,出現重複結點啦 return pre; }else { head.next = pre; } }
else { if (pre.val == head.val) { head.next = pre.next; }else { head.next = pre; } } return head; }

//很巧妙的 人家的思路:head.next = deleteDuplicates(head.next); 這樣就相比較於自己的程式碼:

// ListNode pre = deleteDuplicates(head.next);
//ListNode pre = deleteDuplicates(head.next);

好處在於不用判斷 pre的情況,不用擔心使用 pre.next == null 的情況,又判斷 pre == null的情況

2,反轉連結串列:

(1)細節優化度高的程式碼:

先說一下遞迴思路:

* 遞迴: 根據語義 reverseList(ListNode head),返回一條倒置的連結串列的頭結點,
* 例如:原結點是 heda -》5-》4 -》3 -》2 -》1
* 利用語義的話 reverseList(head.next),得到了 head -》5 -》
* newHead -》1 -》2 -》3 -》4
* 細節:因為沒有斷鏈,原來的5 還是指導 4 身上, 即 newHead -》1 -》2 -》3 -》4 《- 5 《- head
* 所以,我們可以通過 5 的關係,拿到 4,調整4 指向5 ,
* 細節, 5是最後一個結點:它的next 需要指向空, 通過 head的關係拿到 5

    public ListNode reverseList(ListNode head) {
        if(head == null)    return null;//return head; 也一樣
        if(head.next == null)    return head;
        if(head == null || head.next == null)    return head;
        ListNode newHead = reverseList(head.next);
        //細節:這裡用的是head.next.next(就是 4 這個結點的next指標),而不用 newHead這個變數,好處不用判斷newHead(不為空時,就是4 這個結點) 是否為空,
        //因為咱如果是使用 newHead.next = head;(5 這個結點)   之前必須判斷 newHead 是否為空,而使用 head.next(代表4 這個結點) 時,就可以避免判斷情況
        head.next.next = head;
        head.next = null;
        return newHead;return newHead;
    }