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 次查看

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告