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
结论
我们使用两个示例演示了从链表中删除元素的程序。在第一个示例中,我们使用了节点结构体,在第二个示例中,我们使用了哑节点来执行程序。