Golang 实现链表
在Go编程语言中,链表是一种由一系列节点通过next指针链接在一起的线性数据结构。我们将在这个程序中使用两种方法实现链表。第一种方法使用结构体,第二个示例使用列表结构。
方法1:使用结构体
在这种方法中,链表中有三个节点,每个节点的值分别为1、2或3。每个节点的next指针指向列表中它后面的节点,head变量指向第一个节点。根据每个节点的next指针,循环遍历链表直到达到一个具有空next指针的节点,表示列表的结束。
步骤
- 步骤1 − 创建一个main包,并在程序中声明fmt(格式化包)包,其中main生成可执行的代码,fmt帮助格式化输入和输出。
-
步骤2 − 创建一个带有next和num_val字段的节点结构。节点的值存储在value中,next是指向列表中它后面的节点的指针。
-
步骤3 − 在main函数中创建一个头节点,并将列表的第一个值设置为它的num_value。
-
步骤4 − 创建第二个节点,并将其num_value设置为列表中的下一个值。
-
步骤5 − 通过将头节点的next指针设置为第二个节点,可以连接头节点和第二个节点。
-
步骤6 − 要添加更多节点并连接它们,重复步骤3和4以完成连接的列表。
-
步骤7 − 在头节点的下一个步骤中,创建一个当前指针并设置它。
-
步骤8 − 使用for循环沿着链表遍历时,按照每个节点的next指针进行下一个指针的操作。
-
步骤9 − 使用fmt.Println()函数在for循环中打印当前节点的值,其中ln表示换行。
-
步骤10 − 通过将其更新为下一个指针的值,当前指针被更改为列表中的下一个节点。
-
步骤11 − 重复步骤7-9,直到当前节点的next指针为空,表示列表结束。
示例
在这个示例中,我们将使用结构体来实现链表。
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结构。通过构造一个新节点,将其下一个指针设置为现有头节点,并修改List结构的头字段以指向新节点,Insert方法在列表的开头添加一个具有指定值的新节点。按照每个节点的下一个指针,Print方法打印列表中每个节点的值。
步骤
- 步骤1 - 在程序中创建一个main包,并声明fmt(格式化包)包,其中main生成可执行代码,fmt帮助格式化输入和输出。
-
步骤2 - 创建一个List结构,并给其头字段赋予*Node类型。
-
步骤3 - 创建一个Node结构,具有值和其后节点的两个字段。节点的值存储在value中,next是指向列表中其后节点的指针。
-
步骤4 - 创建一个接受List结构中的值作为参数的Insert方法。
-
步骤5 - 在Insert方法中创建一个具有指定值的新节点n。
-
步骤6 - 将新节点的下一个指针设置为List结构的当前头。
-
步骤7 - 更新List结构的头字段以指向新节点,以指向新节点。
-
步骤8 - 为List结构创建一个名为Print的方法,该方法迭代链表并输出每个节点的值。
-
步骤9 - 在主函数中创建一个List结构,并使用Insert方法向其添加多个节点。
-
步骤10 - 调用Print方法来打印列表中每个节点的值。
示例
在本示例中,我们将使用List结构来实现链表。
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
结论
我们执行了实现链表的程序,使用了两个示例。在第一个示例中,我们使用了struct,在第二个示例中,我们使用了list struct来实现链表。