日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

LeetCode-19 删除链表的倒数第N个节点

發布時間:2023/12/31 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode-19 删除链表的倒数第N个节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 題目描述
      • 我的解法
      • 反思
      • 優化
      • 再次反思
      • 再次優化
      • 總結
      • Github

題目描述

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

示例:

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

當刪除了倒數第二個節點后,鏈表變為 1->2->3->5.

說明:

給定的 n 保證是有效的。

進階:

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


我的解法

public ListNode removeNthFromEnd(ListNode head, int n) {ListNode current = head;List<ListNode> list = new ArrayList<ListNode>();while(current!=null){list.add(current);current = current.next;}int index = list.size()-n-1;//待刪除前一個nodeif(index==-1) {//說明待刪除的是第一個nodereturn list.get(0).next;}list.get(index).next = list.get(index).next.next;return list.get(0);}

用間:9ms
戰勝:91.31%


反思

最先想到的思路就是放到一個ArrayList里邊,遍歷一遍鏈表就有各自的順序了,然后找到list對應序號結點的node,讓它指向下下個node。
但是這種方式無法將所有情況統一處理,不是出題者想考察的。

實際上,鏈表題目有一個固有的結題思路,就是在鏈表的頭部加一個dummy head(啞結點)。如此,一些極端的情況(如鏈表只有一個結點)就得以統一處理。

運用這個思路,我們先嘗試兩次遍歷的算法。即,第一次遍歷鏈表的長度,第二次遍歷到目標結點,使之指向下下個結點


優化

public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0);dummy.next = head;int length = 0;ListNode first = head;while (first != null) {length++;first = first.next;}length -= n;first = dummy;while (length > 0) {length--;first = first.next;}first.next = first.next.next;return dummy.next; }

復雜度分析

時間復雜度:O(L),

該算法對列表進行了兩次遍歷,首先計算了列表的長度 L 其次找到第 (L - n>)個結點。 操作執行了 2L-n 步,時間復雜度為 O(L)。

空間復雜度:O(1),

我們只用了常量級的額外空間。


再次反思

題目在“進階”處給出思考,能否用一次遍歷實現?答案肯定是能。如果我同時遍歷兩個鏈表,一個是從頭開始遍歷,而另外一個呢是從頭開始第n的結點開始遍歷。那么,當我遍歷完第二個鏈表時,第一個鏈表更好遍歷到目標結點,將其next指向下下個結點即可。


再次優化

public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode first = dummy;ListNode second = dummy;// Advances first pointer so that the gap between first and second is n nodes apartfor (int i = 1; i <= n + 1; i++) {first = first.next;}// Move first to the end, maintaining the gapwhile (first != null) {first = first.next;second = second.next;}second.next = second.next.next;return dummy.next; }

復雜度分析

時間復雜度:O(L),
該算法對含有 L 個結點的列表進行了一次遍歷。因此時間復雜度為 O(L)。
空間復雜度:O(1),
我們只用了常量級的額外空間。


總結

  • 鏈表解題模板,先在頭部建立dummy head,方便處理特殊情況問題。
  • 還是以空間換時間

  • Github

    LeetCode刷題筆記

    總結

    以上是生活随笔為你收集整理的LeetCode-19 删除链表的倒数第N个节点的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。