Go 语言程序:从链表中删除元素
在 Go 中,链表是一种线性数据结构,其元素通过指针连接,从第一个节点(头节点)到最后一个节点(尾节点),可以依次访问每个节点。我们将通过两个示例来演示从链表中删除元素的程序。第一个示例使用节点结构体,第二个示例使用哑节点。
方法 1:使用节点结构体
此代码创建了一个 Node 结构体,它有两个字段:Value 和 Next,后者链接到列表中的下一个节点。remove_node 方法从列表中删除具有指定值的节点,并返回列表的新头节点。它接受列表的头节点和要删除的值作为参数。
算法
步骤 1 − 创建一个名为 main 的包,并在程序中声明 fmt(格式化包)。main 包生成可执行代码,fmt 包帮助格式化输入和输出。
步骤 2 − 创建一个节点结构体,其中 value 字段类型为 int,next 字段类型为 node。
步骤 3 − 创建一个名为 remove_node 的函数,并在该函数中检查头节点是否为空。如果是,则返回 nil。
步骤 4 − 检查头节点的值是否与要删除的值匹配。如果是,则返回列表中的下一个节点。
步骤 5 − 在下一步中,将头节点设置为当前节点的指针。
步骤 6 − 然后,遍历列表,直到下一个节点不为空。
步骤 7 − 更新当前节点的 next 指针以跳过下一个节点,如果下一个节点的值等于要删除的值,则结束循环。
步骤 8 − 将下一个节点设置为当前节点的指针。
步骤 9 − 将头节点返回到下一个函数。
步骤 10 − 在 main 函数中,打印从链表中删除元素后的当前值。
示例
在此示例中,我们将使用节点结构体从链表中删除元素。
package main
import "fmt"
type Node struct {
Value int
Next *Node
}
func remove_node(head *Node, value int) *Node {
if head == nil {
return nil
}
if head.Value == value {
return head.Next
}
current := head //remove the elements from the list
for current.Next != nil {
if current.Next.Value == value {
current.Next = current.Next.Next
break
}
current = current.Next
}
return head
}
func main() {
head := &Node{Value: 1, Next: &Node{Value: 2, Next: &Node{Value: 3, Next: nil}}}
fmt.Println("The linked list after removal of element is:")
head = remove_node(head, 2)
for current := head; current != nil; current = current.Next {
fmt.Println(current.Value) //print the modified linked list
}
}
输出
The linked list after removal of element is: 1 3
方法 2:使用哑节点
此方法使用哑节点来简化边界情况。remove_node 函数通过接受列表的头节点和要删除的值作为参数,并返回列表的新头节点,来删除具有指定值的节点。让我们通过代码和算法来理解这个概念。
算法
步骤 1 − 创建一个名为 main 的包,并在程序中声明 fmt(格式化包)。main 包生成可执行代码,fmt 包帮助格式化输入和输出。
步骤 2 − 创建一个 Node 结构体,其中 num_value 字段类型为 int,Next 字段类型为 Node。
步骤 3 − 创建一个名为 remove_node 的函数,它有两个输入参数:head 和 value。然后,创建一个哑节点,并将它的 next 字段设置为列表的头节点。
步骤 4 − 创建一个名为 prior 的节点指针,指向哑节点。
步骤 5 − 在下一步中,遍历列表,直到下一个节点不为空。
步骤 6 − 更新前一个节点的 next 指针以跳过下一个节点,如果下一个节点的值与要删除的值相同,则结束循环。
步骤 7 − 然后,将前一个节点指针移动到下一个节点。
步骤 8 − 删除具有指定值的节点后,列表的头节点作为哑节点的 next 字段。
步骤 9 − 将 dummy.next 返回到函数,并在 main 函数中使用 fmt.Println() 函数打印链表,其中 ln 表示换行。
示例
在此示例中,我们将使用哑节点从链表中删除元素。
package main
import "fmt"
type Node struct {
num_value int
Next *Node
}
func remove_node(head *Node, value int) *Node {
dummy := &Node{Next: head} //remove the required element from the list
prev := dummy
for prev.Next != nil {
if prev.Next.num_value == value {
prev.Next = prev.Next.Next
break
}
prev = prev.Next
}
return dummy.Next
}
func main() {
fmt.Println("The linked list after removal of elements:")
head := &Node{num_value: 1, Next: &Node{num_value: 2, Next: &Node{num_value: 3, Next: nil}}}
head = remove_node(head, 2)
for current := head; current != nil; current = current.Next {
fmt.Println(current.num_value) //print the modified list
}
}
输出
The linked list after removal of elements: 1 3
结论
我们使用两个示例演示了从链表中删除元素的程序。在第一个示例中,我们使用了节点结构体,在第二个示例中,我们使用了哑节点来执行程序。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP