演算法之小細節(細節~連結串列的特殊結點~提升優化度)~反轉連結串列、刪除排序連結串列中的重複元素
阿新 • • 發佈:2021-10-11
演算法之小細節(細節~連結串列的特殊結點~提升優化度)~刪除排序連結串列中的重複元素、反轉連結串列
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); 好處在於不用判斷 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; }