Go语言程序:从链表中删除第一个节点


2022 年 4 月 30 日, Learn eTutorial
1286

在某些情况下,我们希望从链表中删除一些节点。这些情况可以通过使用链表的删除操作来处理。删除是链表的重要操作之一,它允许从链表中删除节点。

我们可以说链表是一种线性数据结构,它包含一组节点,每个节点都有两个属性:数据和下一个指针。这里的 Next 是指向列表中下一个节点的指针。有许多链表操作允许我们对链表执行不同的操作。例如,删除操作将从链表中删除一个节点。

在此程序中,我们将创建一个单向链表并删除链表中的第一个节点。为了完成此任务,我们将遍历链表直到头节点变为 nil。如果节点不为 nil,则转到头节点的下一个节点,并将该下一个节点设置为头节点来更新链表。让我们更详细地了解这个程序。

如何从链表中删除第一个节点

在此程序中,我们将重点关注如何使用 Go 语言从给定链表中删除第一个节点。
有一个 `fmt` 包用于将一些标准库导入程序。使用内置函数 `fmt.println()` 在屏幕上打印任何内容,使用 `fmt.scanln()` 读取输入数据。我们需要导入“**fmt**”包才能使用这些函数。之后,打开主函数。我们将在主函数中完成整个程序,主函数是程序的起点。

这里我们使用结构体来定义一个节点。`NewNode` 函数通过将数据赋给其节点值并更改节点的指针为下一个节点来创建链表的节点。现在,**head** 是链表的起始节点。

`TraverseLinkedList(head)` 函数通过遍历从**head**开始的列表,直到找到引用值**nil**,来显示链表中的所有节点。

每当您想从给定链表中删除第一个节点时,调用 `DeleteFirstNode(head)` 函数。它定义了一个接受链表头节点的方法。检查头节点是否等于 nil,这意味着列表为空。如果**head**等于 nil,则返回头节点而不删除任何节点。否则,通过删除第一个节点来更新链表。这意味着将头节点的下一个节点作为新头节点,并通过将**nil**值赋给其指针来取消旧头节点。最后,将新头节点返回到主函数。您可以通过调用 `TraverseLinkedList` 函数来显示更新后的链表。

下面是Go程序中用于从链表中删除第一个节点的步骤。

算法

步骤 1:开始
步骤 2:定义一个节点结构体
步骤 3:通过调用函数 NewNode() 创建一个链表。这里的 head 是链表的起始节点。
步骤 4:通过调用 `TraverseLinkedList(head)` 函数显示输入链表。
步骤 5:通过调用 `DeleteFirstNode(head)` 从链表中删除第一个节点
步骤 6:通过调用 `TraverseLinkedList(head)` 函数显示更新后的链表。
步骤 7:退出

实现 NewNode(value) 的步骤

步骤 1:声明变量 n 为 Node 类型。
步骤 2:通过将数据分配给节点值并将节点的指针更改为下一个节点来创建节点 n
步骤 3:返回节点 n

实现 TraverseLinkedList(head) 的步骤

步骤 1:通过遍历从**头节点**开始的列表,直到找到引用值为**nil**,来显示链表中的所有节点。

实现 `DeleteFirstNode(head)` 的步骤

步骤 1:定义一个接受链表 head 的方法。
步骤 2:检查头节点是否等于 nil。如果**头节点**等于 nil,则返回头节点而不删除任何节点。否则执行步骤 3。
步骤 3:取**头节点**的下一个节点,并将其设为新头节点,从而删除第一个节点。
步骤 4:返回新的头节点。
 

Golang 源代码

                                          package main
import "fmt"
type Node struct {
   value int
   next *Node
}
func NewNode(value int, next *Node) *Node{
   var n Node
   n.value = value
   n.next = next
   return &n
}
func TraverseLinkedList(head *Node){
   temp := head
   for temp != nil {
      fmt.Printf("%d ", temp.value)
      temp = temp.next
   }
   fmt.Println()
}
func DeleteFirstNode(head *Node) *Node{
   if head == nil{
      return head
   }
   newHead := head.next
   head.next = nil
   return newHead
}
func main(){
   head := NewNode(30, NewNode(10, NewNode(80, NewNode(70, nil))))
   fmt.Printf("Input Linked list is: ")
   TraverseLinkedList(head)
   head = DeleteFirstNode(head)
   fmt.Printf("Updated linked list after deleting first node: ")
   TraverseLinkedList(head)
}

                                      

输出

Input Linked list is: 30 10 80 70 
Updated linked list after deleting first node: 10 80 70