iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
佛心分享-刷題不只是刷題

刷題筆記系列 第 28

[Day28] Patterns: In-place reversal of linked list(原地反轉列表)

  • 分享至 

  • xImage
  •  

在Leetcode的題目中,有些題目會要求你不能使用額外的空間、只能原地反轉linked list,這時就會需要用到 In-place reversal of linked list(原地反轉列表)的技巧了。

先來複習單鏈表(Singly Linked List)的特性

  1. 每個node(節點)包含兩部分:資料和指向下一個node(節點)的指針
  2. 每個node(節點)只會指向下一個node(節點)
  3. 終點(也就是linked list的最後一個node(節點))會指向null

https://ithelp.ithome.com.tw/upload/images/20240908/20168667fVL46Hg02L.png
source: Wiki

如何原地反轉?

根據上面的特性,透過逐次反轉指針把整個列表反轉,一次轉向一個指針。
每個節點只會記錄上一個節點的位置(如上圖示,只有節點99會記錄節點12的位置,只有節點37會記錄節點99的位置),所以在轉向指針的過程中,也要記錄轉向前指針所指的節點,否則一旦指針轉向,就再也無法存取該節點。

設定當前的node(節點)為current、前一個node(節點)為previous、下一個node(節點)為next,如下方圖解:

步驟如下:

  1. 調整current的指針方向 → 原本current指向next,改成把current指向previous
  2. 接著往前移動,原本current往前變成previous、next變成current,這時原本下下個node(節點)變成了新的next
  3. 重覆步驟1.

圖解如下
https://ithelp.ithome.com.tw/upload/images/20240908/20168667tKurGh7W1S.png
整體來說,其實就是每次只反轉previous跟current之間的指針。如此反覆步驟,直到所有node(節點)的指針反轉。


Reference: https://alrightchiu.github.io/SecondRound/linked-list-xin-zeng-zi-liao-shan-chu-zi-liao-fan-zhuan.html


上一篇
[Day27] Find All Duplicates in an Array
下一篇
[Day29] Reverse Linked List
系列文
刷題筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言