生活随笔
收集整理的這篇文章主要介紹了
虚拟头结点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
沒有虛擬頭結點,那頭結點的刪除需要分開考慮,不能通過slow.next = slow.next.next
ListNode removeNthFromEnd(ListNode head, int n) {ListNode fast, slow;fast = slow = head;// 快指針先前進 n 步while (n-- > 0) {fast = fast.next;}if (fast == null) {// 如果此時快指針走到頭了,// 說明倒數第 n 個節點就是第一個節點return head.next;}// 讓慢指針和快指針同步向前while (fast != null && fast.next != null) {fast = fast.next;slow = slow.next;}// slow.next 就是倒數第 n 個節點,刪除它slow.next = slow.next.next;return head;
}
使用虛擬頭結點
注意我們使用了虛擬頭結點的技巧,也是為了防止出現空指針的情況,比如說鏈表總共有 5 個節點,題目就讓你刪除倒數第 5 個節點,也就是第一個節點,那按照算法邏輯,應該首先找到倒數第 6 個節點。但第一個節點前面已經沒有節點了,這就會出錯。
// 返回鏈表的倒數第 k 個節點
ListNode findFromEnd(ListNode head, int k) {ListNode p1 = head;// p1 先走 k 步for (int i = 0; i < k; i++) {p1 = p1.next;}ListNode p2 = head;// p1 和 p2 同時走 n - k 步while (p1 != null) {p2 = p2.next;p1 = p1.next;}// p2 現在指向第 n - k 個節點return p2;
}
// 主函數
public ListNode removeNthFromEnd(ListNode head, int n) {// 虛擬頭結點ListNode dummy = new ListNode(-1);dummy.next = head;// 刪除倒數第 n 個,要先找倒數第 n + 1 個節點ListNode x = findFromEnd(dummy, n + 1);// 刪掉倒數第 n 個節點x.next = x.next.next;return dummy.next;
}private ListNode findFromEnd(ListNode head, int k) {// 代碼見上文
}
總結
以上是生活随笔為你收集整理的虚拟头结点的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。