畫解算法:19. 刪除鏈表的倒數第N個節點

題目連接

leetcode-cn.com/problems/re…java

題目描述

給定一個鏈表,刪除鏈表的倒數第 n 個節點,而且返回鏈表的頭結點。node

示例:算法

給定一個鏈表: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
複製代碼

說明:bash

給定的 n 保證是有效的。spa

進階:指針

你能嘗試使用一趟掃描實現嗎?code

解題方案

思路

  • 標籤:鏈表
  • 總體思路是讓前面的指針先移動n步,以後先後指針共同移動直到前面的指針到尾部爲止
  • 首先設立預先指針pre,預先指針是一個小技巧,在第2題中進行了講解
  • 設預先指針pre的下一個節點指向head,設前指針爲start,後指針爲end,兩者都等於pre
  • start先向前移動n步
  • 以後startend共同向前移動,此時兩者的距離爲n,當start到尾部時,end的位置剛好爲倒數第n個節點
  • 由於要刪除該節點,因此要移動到該節點的前一個才能刪除,因此循環結束條件爲start.next != null
  • 刪除後返回pre.next,爲何不直接返回head呢,由於head有多是被刪掉的點
  • 時間複雜度:O(n)

代碼

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {    
        ListNode pre = new ListNode(0);
        pre.next = head;
        ListNode start = pre, end = pre;
        while(n != 0) {
            start = start.next;
            n--;
        }
        while(start.next != null) {
            start = start.next;
            end = end.next;
        }
        end.next = end.next.next;
        return pre.next;
    }
}
複製代碼

畫解

fr<x>ame_00001.png
fr<x>ame_00002.png
fr<x>ame_00003.png
fr<x>ame_00004.png
fr<x>ame_00005.png
fr<x>ame_00006.png
fr<x>ame_00007.png
fr<x>ame_00008.png

後臺回覆「算法」,加入每天算法羣 以爲算法直擊靈魂,歡迎點擊在看轉發cdn

相關文章
相關標籤/搜索