串列應用題 移除尾巴數來的第n個節點 Leetcode #19

閱讀時間約 3 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點

例如
1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。

尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下

1->2->3->5


測試範例

Example 1:

raw-image
Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]

Example 2:

Input: head = [1], n = 1
Output: []

Example 3:

Input: head = [1,2], n = 1
Output: [1]

演算法:

使用雙指針演算法,一個快指針,一個慢指針。

快指針提早領先出發n步,接著慢指針和快指針再一起往前移動。
當快指針抵達終點時,慢指針會剛好指向尾巴數來第n個節點的前一個位置。

註:
為什麼要尾巴數來第n個節點前一個位置?
因為不僅僅是刪除而已,還要更新連結 node.next

raw-image
raw-image
raw-image
raw-image

程式碼

class Solution:
 def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
  
  # use dummy head will make the removal of head node easier
  dummy_head = ListNode(-1)
  dummy_head.next = head
  
  # cur keeps iteration till the end
  # prev_of_removal traverses to the previous node of the one of being removed
  cur, prev_of_removal = dummy_head, dummy_head
  
  
  while cur.next != None:
   
   # n-step delay for prev_of_removal
   if n <= 0:
    prev_of_removal = prev_of_removal.next
    
   cur = cur.next
   
   n -=1
  
  
  # Remove the N-th node from end of list
  n_th_node = prev_of_removal.next
  prev_of_removal.next = n_th_node.next
  
  del n_th_node
  
  return dummy_head.next

複雜度分析

時間複雜度: O( n )
從左到右,把整個串列掃描一遍。

空間複雜度: O( 1 )
用到一組雙指針,指針所占用的空間大小都是固定的,為常數級別O(1)。


關鍵知識點

在於畫圖觀察規律,想到用快、慢雙指針,快指針領先慢指針n步,定位尾巴數來第n個節點的演算法。


Reference:

[1] Python/Go/JS/C++ O(n) by two-pointers [w/ Visualization] - Remove Nth Node From End of List - LeetCode

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定我們一個n值,問我們n! 也就是n階乘 尾巴的零有多少個? 例如n=5 就是代表5! = 5x4x3x2x1=120 尾巴有一個零,回傳1
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目會給定一組輸入陣列,裡面每個參數分別代表矩陣的寬和高。 如果有兩個矩陣的寬/高的比例是相同的,代表這兩個矩陣是等比例的。 要求我們計算,等比例的矩陣pair總共有多少個?
題目會給定我們一個輸入陣列,要求我們計算好配對的數目有多少個? 好配對的定義: 兩個數字相同,但是陣列索引一個在前,一個在後。 nums[i] == nums[j] and i < j. 這樣 (i, j) 就稱為一組好配對。
題目會給定我們一個陣列和參數k,要求我們將陣列右旋k次,然後輸出內容。 例如[1,2,3,4,5] 右旋 2次,輸出就是[4,5,1,2,3]
題目會給定我們一個n值,問我們n! 也就是n階乘 尾巴的零有多少個? 例如n=5 就是代表5! = 5x4x3x2x1=120 尾巴有一個零,回傳1
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目會給定一組輸入陣列,裡面每個參數分別代表矩陣的寬和高。 如果有兩個矩陣的寬/高的比例是相同的,代表這兩個矩陣是等比例的。 要求我們計算,等比例的矩陣pair總共有多少個?
題目會給定我們一個輸入陣列,要求我們計算好配對的數目有多少個? 好配對的定義: 兩個數字相同,但是陣列索引一個在前,一個在後。 nums[i] == nums[j] and i < j. 這樣 (i, j) 就稱為一組好配對。
題目會給定我們一個陣列和參數k,要求我們將陣列右旋k次,然後輸出內容。 例如[1,2,3,4,5] 右旋 2次,輸出就是[4,5,1,2,3]
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
Thumbnail
這篇文章,會帶著大家複習以前學過的遞回框架, 並且鏈結串列的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 遞回框架 尋找共通模式(common pattern),對應到演算法的General case 確立初始條件(initial conditio
Thumbnail
題目敘述 題目會給定我們一條鏈結串列Linked list的起始節點,要求我們刪除Linked List正中央的節點。 註: 正中央的節點,題目定義為索引為floor( 串列長度 / 2 ) 的節點,索引從零(Head Node)出發開始數。 例如 1 -> 2 -> 3 -> 4 鏈結
Thumbnail
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
Thumbnail
讀《聲入Spotify》這本書時,透過Spotify這個案例,我特別想要了解兩個問題:一是「免費增值」(freemium)的商業模式;也就是串流平台盡可能的提供免費服務給顧客,再吸引顧客付費購買額外功能的營利方式。第二個則是公司和創作者之間可能產生的爭議。
Thumbnail
前面提到變數為程式儲存資料的地方,一個變數可以儲存一個學生的成績、一個人的身高、或是一個人名等,但如果多人的資料要管理,為每個人設計一個變數顯然就有點不切實際,串列就是用來解決這樣的問題。
Thumbnail
《#地獄公使》簡直現代變形記。《#洛基》影集超展開,超奇幻,超引人入勝。《#喜歡是深深的愛》這本小說完全打中了我。沒想到《#駭客軍團》可以出現在串流平台。《#守望者》對我來說已經是藝術品。克蘇魯始祖 #Lovecraft 的翻譯小說真的精彩。但是串流平台實在太邪惡!
Thumbnail
先前說過《天橋上的魔術師》是帶著2020的批判目光回望那個既是都市化經濟奇蹟、卻也保守威權並存的80年代,對威權政治與性別政治的反思成為導演楊雅喆一雙利刃,直指80年代的輝煌與虛妄。很多人也許會問,為什麼要這樣處理呢?
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
Thumbnail
這篇文章,會帶著大家複習以前學過的遞回框架, 並且鏈結串列的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 遞回框架 尋找共通模式(common pattern),對應到演算法的General case 確立初始條件(initial conditio
Thumbnail
題目敘述 題目會給定我們一條鏈結串列Linked list的起始節點,要求我們刪除Linked List正中央的節點。 註: 正中央的節點,題目定義為索引為floor( 串列長度 / 2 ) 的節點,索引從零(Head Node)出發開始數。 例如 1 -> 2 -> 3 -> 4 鏈結
Thumbnail
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
Thumbnail
讀《聲入Spotify》這本書時,透過Spotify這個案例,我特別想要了解兩個問題:一是「免費增值」(freemium)的商業模式;也就是串流平台盡可能的提供免費服務給顧客,再吸引顧客付費購買額外功能的營利方式。第二個則是公司和創作者之間可能產生的爭議。
Thumbnail
前面提到變數為程式儲存資料的地方,一個變數可以儲存一個學生的成績、一個人的身高、或是一個人名等,但如果多人的資料要管理,為每個人設計一個變數顯然就有點不切實際,串列就是用來解決這樣的問題。
Thumbnail
《#地獄公使》簡直現代變形記。《#洛基》影集超展開,超奇幻,超引人入勝。《#喜歡是深深的愛》這本小說完全打中了我。沒想到《#駭客軍團》可以出現在串流平台。《#守望者》對我來說已經是藝術品。克蘇魯始祖 #Lovecraft 的翻譯小說真的精彩。但是串流平台實在太邪惡!
Thumbnail
先前說過《天橋上的魔術師》是帶著2020的批判目光回望那個既是都市化經濟奇蹟、卻也保守威權並存的80年代,對威權政治與性別政治的反思成為導演楊雅喆一雙利刃,直指80年代的輝煌與虛妄。很多人也許會問,為什麼要這樣處理呢?