Golang 从链表删除元素
在Go中,链表是一种具有指针连接项的线性数据结构,从第一个节点(头节点)到最后一个节点,每个节点都可以被访问(尾节点)。我们将使用两个示例执行从链表中删除元素的程序。第一个示例使用节点结构,而第二个示例使用虚设节点。
方法1:使用节点结构
此代码创建了一个具有两个字段(Value和Next)的节点结构,其中Next链接到列表中的下一个节点。remove_node方法从列表中删除具有指定值的节点并返回列表的新头节点。它接受列表的头节点和要删除的值作为参数。
步骤
- 步骤1 - 创建一个包main,并在该程序中声明fmt(格式化包)包,其中main生成可执行代码,fmt帮助格式化输入和输出。
-
步骤2 - 创建一个具有int类型值和节点类型next的节点结构。
-
步骤3 - 创建一个remove_node函数,检查头节点是否为空。如果是空的,返回nil。
-
步骤4 - 验证头节点的值是否与要删除的值匹配。如果是,则返回列表中的下一个节点。
-
步骤5 - 在下一步中,将头节点设置为当前节点的指针。
-
步骤6 - 然后,遍历列表直到下一个节点为零。
-
步骤7 - 如果以下节点的值等于要删除的值,则更新当前节点的下一个指针以跳过以下节点,并结束循环。
-
步骤8 - 将下一个节点设置为当前节点的指针。
-
步骤9 - 将头节点返回到以下函数。
-
步骤10 - 在主函数中打印从链表中删除元素后的当前值。
示例
在这个示例中,我们将使用节点结构从链表中删除元素。
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 - 在程序中创建一个package main,并声明fmt(格式化包)包,其中main产生可执行代码,fmt帮助格式化输入和输出。
-
步骤2 - 创建一个Node结构,包括类型为int的num_value和类型为Node的Next。
-
步骤3 - 创建一个具有两个输入head和value的remove_node函数。然后,创建一个哑结点,并将其next字段设置为列表的头部。
-
步骤4 - 创建一个prior节点指针,指向哑结点。
-
步骤5 - 在下一步中,只要下一个节点不为零,遍历列表。
-
步骤6 - 更新前一个节点的下一个指针,以跳过后续节点,并在后续节点的值等于要删除的值时结束循环。
-
步骤7 - 然后,将前一个节点指针移到下一个节点。
-
步骤8 - 在删除具有给定值的节点之后,列表的头部作为哑结点的下一个字段。
-
步骤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
结论
我们通过两个示例执行了从链表中删除元素的程序。在第一个示例中,我们使用了节点结构,而在第二个示例中,我们将使用虚拟节点来执行程序。