使用Go语言实现链表


在 Go 编程语言中,链表是一种线性数据结构,由一系列节点组成,这些节点通过下一个指针相互链接,该指针指向下一个地址。我们将使用两种方法在这个程序中实现链表。在第一种方法中将使用结构体,在第二个示例中将使用列表结构体。

方法 1:使用结构体

在这种方法中,此链表中有三个节点,每个节点的值为 1、2 或 3。每个节点的下一个指针指向列表中其后的节点,而 head 变量指向第一个节点。for 循环沿着每个节点的下一个指针遍历链表,直到到达下一个指针为 nil 的节点,这表示列表的结尾。

算法

  • 步骤 1 − 创建一个包 main 并声明程序中的 fmt(格式化包)包,其中 main 生成可执行代码,fmt 帮助格式化输入和输出。

  • 步骤 2 − 创建一个具有 next 和 num_val 字段的节点结构。节点的值存储在 value 中,next 是指向列表中其后节点的指针。

  • 步骤 3 − 在 main 函数中创建一个 head 节点,并将其 num_value 设置为列表的第一个值。

  • 步骤 4 − 应创建一个第二个节点,并将其 num_value 设置为列表中的下一个值。

  • 步骤 5 − 通过将 head 节点的 next 指针设置为第二个节点,可以连接 head 节点和第二个节点。

  • 步骤 6 − 要添加更多节点并将其连接起来,请重复步骤 3 和 4 以完成连接列表。

  • 步骤 7 − 在下一步中,创建指向 head 节点的当前指针并将其设置。

  • 步骤 8 − 使用 for 循环遍历链表时,请遵循每个节点的 next 指针。

  • 步骤 9 − 使用 fmt.Println() 函数在 for 循环内打印当前节点的值,其中 ln 表示换行。

  • 步骤 10 − 通过将其更新为 next 指针的值,当前指针将更改为列表中的下一个节点。

  • 步骤 11 − 重复步骤 7-9,直到当前节点的 next 指针为 nil,这表示列表的结尾。

示例

在这个示例中,我们将使用结构体来实现链表。

package main
import "fmt"

type node struct { //create a struct
   num_val int
   next    *node
}

func main() {
   head := &node{num_val: 1}
   head.next = &node{num_val: 2}
   head.next.next = &node{num_val: 3}
   fmt.Println("The implementation of linked list is given as following:")

   current := head
   for current != nil {               //run a for loop to print values of current node
      fmt.Println(current.num_val)
      current = current.next
   }
}

输出

The implementation of linked list is given as following:
1
2
3

方法 2:使用列表结构体

在此实现中,链表被实现为一个 List 结构体,该结构体具有一个指向根节点的 head 字段。通过构造一个新节点,将其 next 指针设置为现有的 head 节点,并将 List 结构体的 head 字段修改为指向新节点,Insert 方法在列表的开头添加一个具有指定值的新节点。Print 方法沿着每个节点的 next 指针遍历列表,并打印每个节点的值。

算法

  • 步骤 1 − 创建一个包 main 并声明程序中的 fmt(格式化包)包,其中 main 生成可执行代码,fmt 帮助格式化输入和输出。

  • 步骤 2 − 创建一个 List 结构体,并将其 head 字段的类型设置为 *Node。

  • 步骤 3 − 创建一个 Node 结构体,其两个字段为 value 和 next。节点的值存储在 value 中,next 是指向列表中其后节点的指针。

  • 步骤 4 − 为 List 结构体创建一个接受一个值作为参数的 Insert 方法。

  • 步骤 5 − 在 Insert 方法内创建一个具有指定值的新节点 n。

  • 步骤 6 − 将新节点的 next 指针设置为 List 结构体的当前 head。

  • 步骤 7 − 要指向新节点,请更新 List 结构体的 head 字段。

  • 步骤 8 − 为 List 结构体创建一个名为 Print 的方法,该方法遍历链表并输出每个节点的值。

  • 步骤 9 − 在 main 函数中创建一个 List 结构体,并使用 Insert 方法向其中添加多个节点。

  • 步骤 10 − 要打印列表中每个节点的值,请调用 Print 方法。

示例

在这个示例中,我们将使用列表结构体来实现链表。

package main
import "fmt"

type List struct { //create a list struct
   head *Node
}

type Node struct {
   value_num int
   next      *Node
}

func (l *List) Insert(value_num int) {
   n := &Node{value_num: value_num}
   n.next = l.head
   l.head = n
}

func (l *List) Print() {
   current := l.head
   for current != nil {
      fmt.Println(current.value_num)
      current = current.next
   }
}

func main() {
   list := &List{}  //create a list struct
   fmt.Println("The implementation of linked list is given as:")
   list.Insert(3)
   list.Insert(2)
   list.Insert(1)
   list.Print()
}

输出

The implementation of linked list is given as:
1
2
3

结论

我们使用两个示例执行了实现链表的程序。在第一个示例中,我们使用了结构体,在第二个示例中,我们使用了列表结构体来实现链表。

更新于: 2023年2月22日

287 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.