Golang程序 从链表中删除元素
在Go中,链表是一个线性数据结构,用指针连接各个项目,从第一个节点(头)到最后一个节点,每个节点都可以被访问(尾)。我们将用两个例子来执行从链接列表中删除元素的程序。第一个例子使用节点结构,而第二个例子使用一个假节点
方法一:使用Node结构
这段代码创建了一个Node结构,它有两个字段。Value和Next,它链接到列表中的下一个节点。remove_node 方法从列表中移除具有提供的值的节点,并返回列表的新头部。它接受列表的头部和要删除的值作为参数。
算法
- 第1步 – 创建一个包main,并在程序中声明fmt(format package)包,其中main产生可执行代码,fmt帮助格式化输入和输出。
-
第2步 – 创建一个节点结构,其值为int类型,下一个为节点类型。
-
第 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:使用Dummy节点
这个方法采用了一个假的节点来使边缘情况更简单。remove_node 函数将列表的头部和要删除的值作为参数,并返回列表的新头部,从而删除带有提供的值的节点。让我们通过代码和算法来理解这个概念。
算法
- 第1步 – 创建一个包main,并在程序中声明fmt(format package)包,其中main产生可执行代码,fmt帮助格式化输入和输出。
-
第2步 – 创建一个Node结构,num_value为int类型,Next为Node类型。
-
第 3步 – 创建一个函数remove_node,有两个输入head和value。然后,制作一个假节点,并将其下一个字段设置为列表的头部。
-
第4步– 创建一个指向假节点的先行节点指针。
-
第 5步– 在下一步中,遍历列表,只要下面的节点不为零。
-
第6步– 更新前一个节点的下一个指针,跳过后续节点,如果后续节点的值与要删除的值相同,则结束循环。
-
第7步 – 然后,向下面的节点,移动前一个节点的指针。
-
第8步 – 移除提供值的节点后的列表头部作为假节点的下一个字段。
-
第9步 – 将dummy.next返回给函数,在主函数中使用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
结论
我们用两个例子执行了从链接列表中删除元素的程序。在第一个例子中,我们使用节点结构,在第二个例子中,我们将使用假节点来执行程序。