首頁  >  文章  >  後端開發  >  一行內反向鍊錶

一行內反向鍊錶

WBOY
WBOY轉載
2024-02-09 09:18:19984瀏覽

一行內反向鍊錶

php小編魚仔為您介紹一個常見的資料結構演算法-「一行內反向鍊錶」。在這個演算法中,我們需要將一個鍊錶中的節點順序反轉。透過簡潔而有效率的程式碼實現,我們可以在一行內完成這個操作,使得鍊錶的順序完全顛倒過來。這個演算法在實際程式設計中非常有用,無論是在資料處理還是演算法設計中,都能發揮重要作用。讓我們一起來了解這個精彩的演算法吧!

問題內容

我剛剛在 leetcode 上使用 go 中的一行找到了反向鍊錶的解決方案。它確實有效,但我不明白如何實現。

就是這樣:

func reverselist(head *listnode) (prev *listnode) {
    for head != nil {
        prev, head, head.next = head, head.next, prev 
    }
    
    return
}

例如,讓列表為 [1->2->3->4->5->nil]

我知道它的工作原理如下:

  1. 首先去執行head.next = prev (head.next = nil, 所以現在head = [1->nil] )

  2. 然後, prev = head(在這一步prev = [1->nil] 就像上一步中的head 一樣)

  3. head = head.next 這就是魔法。對於第二步驟go中的prev,使用head = [1->nil],但在這一步驟之後head = [2->3-&gt ;4->5->nil]

因此,當head != nil 時,它會進行迭代,並在第二步prev = [2->1->nil]head = [3->4->5->nil] 等等。

這條線可以表示為:

for head != nil {
        a := *head
        prev, a.Next = &a, prev
        head = head.Next
    }

我說得對嗎?為什麼會這樣呢?

解決方法

表達式左邊的變數將會被指派給當時表達式右邊的值。這是語言的巧妙運用。

為了更容易理解,我們來看一個例子。

設定

這是我們的連結清單: 1 -> 2 -> 3 -> 4 -> 無

在函數執行之前,

  • 頭是*節點 1
  • prev 為零(未初始化)
  • head.next 是*節點 2

一步一步

prev, head, head.next = head, head.next, prev

讓我們分解一下,

  • prev (nil) = 頭 (*節點 1)
  • head (*節點 1) = head.next (*節點 2)
  • head.next (*節點 2) = prev (nil)

下次迭代,

  • prev (*節點 1) = head (*節點 2)
  • head (*節點 2) = head.next (*節點 3)
  • head.next (*節點 3) = prev (*節點 1)

摘要

基本上,它將 head.next 反轉到前一個節點,並將 prev 和 head 移動到下一個節點。

將其與 go 中的教科書演算法進行比較以明確:

func reverseList(head *ListNode) *ListNode {
    var prev *ListNode

    for head != nil {
        nextTemp := head.Next
        head.Next = prev
        prev = head
        head = nextTemp
    }

    return prev
}

以上是一行內反向鍊錶的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除