Go 語言程式:計算迴圈連結串列中的節點數


在 Go 語言中,迴圈連結串列是一種重要的資料結構,用於計算機科學中有效地管理記憶體和資料。迴圈連結串列是一個連結串列,其中列表的最後一個節點指向列表的第一個節點,從而形成一個迴圈。

使用遍歷方法

在這種方法中,我們將編寫一個 Go 語言程式,透過遍歷迴圈連結串列來計算其中的節點數。

演算法

  • 步驟 1 - 首先,我們需要匯入 fmt 包。

  • 步驟 2 - 現在,初始化一個節點結構體並在其中分配兩個變數。第一個變數儲存整數資料,而第二個指標變數儲存指向下一個節點的地址。

  • 步驟 3 - 現在,建立一個名為 countNodes() 的不同函式。此函式接受要遍歷的列表作為引數。

  • 步驟 4 - 在函式內部,將 0 儲存到 count 變數中,並將列表的頭節點儲存到 current 變數中。

  • 步驟 5 - 使用 for 迴圈遍歷連結串列,並在每次到達新節點時遞增 count 變數。此外,返回此變數。

  • 步驟 6 - 啟動 main() 函式。在 main() 函式內部,初始化不同的節點,例如 head、node2、node3 等,並透過將下一個節點的地址儲存到當前節點的下一個元素來將它們連結在一起。

  • 步驟 7 - 現在呼叫 countNodes() 函式並將連結串列的頭節點作為引數傳遞給該函式。

  • 步驟 8 - 此外,將函式獲得的計數儲存到一個不同的變數中,並使用 fmt.Println() 函式將其列印到螢幕上。

示例

以下示例演示瞭如何開發一個 Go 語言程式,透過使用遍歷方法來計算迴圈連結串列中的節點數。

package main

import "fmt"

type Node struct {
   data int
   next *Node
}

func countNodes(head *Node) int {
   count := 0
   current := head

   for current != nil && current.next != head {
      count++
      current = current.next
   }

   if current == head {
      count++
   }
   return count
}

func main() {
   head := &Node{data: 1}
   node2 := &Node{data: 2}
   node3 := &Node{data: 3}
   node4 := &Node{data: 4}
   head.next = node2
   node2.next = node3
   node3.next = node4
   node4.next = head

   count := countNodes(head)
   fmt.Println("The number of nodes in the given circular linked list are:", count)
}

輸出

The number of nodes in the given circular linked list are: 3

使用弗洛伊德迴圈查詢演算法

在這種方法中,我們將編寫一個 Go 語言程式,使用弗洛伊德迴圈查詢演算法來計算迴圈連結串列中存在的節點數。此演算法使用兩個指標變數,一個變數一次移動一個節點,而另一個變數一次移動兩個節點。

演算法

  • 步驟 1 - 首先,我們需要匯入 fmt 包。然後建立一個名為 struct 的節點,並在其中儲存一個變數來儲存資料,以及一個指標來儲存下一個節點的地址。

  • 步驟 2 - 建立一個名為 countNodes() 的函式來計算給定列表中存在的節點數。建立兩個名為 slow 和 fast 的指標變數,並將頭節點的地址儲存到它們中。

  • 步驟 3 - 使用迴圈遍歷連結串列,直到 fast 指標到達列表的末尾或到達 slow 指標。如果發生這種情況,則表示沒有迴圈,因此返回 0 作為列表中的節點數。

  • 步驟 4 - 為了計算節點數,再次遍歷連結串列並遞增 count 變數並將 slow 指標向前移動一步。

  • 步驟 5 - 一旦 slow 指標再次到達 fast 指標,我們就計算迴圈中的所有節點。返回 count 變數作為連結串列中的節點數。

  • 步驟 6 - 現在,啟動 main() 函式。在 main() 內部使用節點結構體初始化頭節點併為其分配值。

  • 步驟 7 - 以這種方式建立不同的節點並將它們與頭節點連結起來。透過將頭節點作為引數傳遞給函式來呼叫 countNodes() 函式。

  • 步驟 8 - 將函式獲得的結果儲存在一個變數中並將其列印到螢幕上。

示例

以下示例說明了如何建立 Go 語言程式,使用弗洛伊德迴圈查詢演算法來計算迴圈連結串列中的節點數。

package main

import "fmt"

type Node struct {
   data int
   next *Node
}

func countNodes(head *Node) int {
   slow := head
   fast := head

   // Detect the presence of a loop
   for fast != nil && fast.next != nil {
      slow = slow.next
      fast = fast.next.next
      if slow == fast {
         break
      }
   }

   count := 0
   if fast != nil && fast.next != nil {
      slow = slow.next
      count++
      for slow != fast {
         count++
         slow = slow.next
      }
   }
   return count
}

func main() {
   head := &Node{data: 1}
   head.next = &Node{data: 2}
   head.next.next = &Node{data: 3}
   head.next.next.next = head

   fmt.Println("Number of nodes present in the circular linked list are:", countNodes(head))
}

輸出

Number of nodes present in the circular linked list are: 3

結論

我們已經成功地編譯並執行了一個 Go 語言程式,用於計算迴圈連結串列中的節點數以及示例。這裡我們使用了兩個程式。在第一個程式中,我們使用遍歷方法,而在第二個程式中,我們使用弗洛伊德迴圈方法來實現結果。

更新於: 2023年4月5日

148 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告