Golang程序实现从链表中删除最后一个节点


2022年4月28日, Learn eTutorial
1332

为了更好地理解这个示例,我们始终建议您学习下面列出的 Golang 编程 的基础主题

这里我们主要关注删除链表的最后一个节点。在此之前,我们应该对链表有一个基本的了解。链表是计算机编程中的一种线性数据结构。链表中的所有元素都通过指针链接。这意味着它有一个或多个节点,每个节点包含数据和一个指向下一个节点的指针。删除是链表中重要的操作之一,它有助于从链表中删除一个节点。所以要删除链表的最后一个节点,我们应该找到倒数第二个节点,并将该节点的下一个指针设置为空。

在此程序中,我们将创建一个单向链表,并移除给定链表的最后一个节点,并更新链表的头节点。为了完成此任务,我们将通过遍历列表来找到倒数第二个节点。如果我们在列表中找到了倒数第二个节点,则通过将其指针设置为 nil 来删除最后一个节点,从而更新链表。  让我们更详细地查看此程序。

如何删除链表的最后一个节点

在这个程序中,我们将重点关注如何使用GO语言从给定链表中删除最后一个节点。

有一个 fmt 包用于将一些标准库导入到程序中。使用内置函数 fmt.println() 在屏幕上打印任何内容。我们需要导入“fmt才能使用此函数。之后,打开 main 函数。我们将在 main 函数中完成整个程序,它是我们程序的起点。这里我们使用一个结构体来定义一个节点。在此程序中还使用另外三个重要的函数,如 NewNode、TraverseLinkedList 和 DeleteLastNode。我们可以更详细地了解这些函数。

NewNode 函数通过将数据赋值给节点值并将节点的指针更改为下一个节点来创建链表节点。现在头节点是链表的起始节点。 

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

每当您想要从给定的链表中删除最后一个节点时,请调用函数 DeleteLastNode(head)。此函数定义了一个接受链表头节点的方法。它检查头节点是否等于 nil,这意味着列表为空。如果头节点等于 nil,则返回头节点而不删除任何节点。否则,声明一个临时指针 temp 并将其赋值给列表的头节点。它帮助您遍历链表以找到最后一个节点。这意味着我们可以通过迭代循环直到条件 temp.next.next != nil 来找到最后一个节点。当“temp.next.next = nil”时,我们可以理解 temp.next 成为倒数第二个节点的位置。通过将 temp.next 的值设置为 nil 来删除链表的最后一个节点。最后,此函数将返回 链表头节点

通过调用函数 TraverseLinkedList 显示更新后的链表。

下面是在 Go 程序中用于从给定链表中删除最后一个节点的步骤。

算法

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

实现 NewNode(value) 的步骤

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

实现 TraverseLinkedList(head) 的步骤

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

实现 DeleteLastNode(head) 的步骤。

步骤 1:定义一个接受链表头节点的方法。
步骤 2:检查头节点是否等于 nil,这意味着列表为空。如果头节点等于 nil,则返回头节点。否则执行步骤 3
步骤 3:声明一个临时指针 temp 并将其赋值给列表的头节点。
步骤 4:遍历列表以到达链表的倒数第二个节点。即:以条件 temp.next.next != nil 迭代循环。如果循环条件为真,则将 temp.next 的值覆盖到 temp 中。 
步骤 5:通过将 temp.next 的值设置为 nil 来删除链表的最后一个节点。
步骤 6:返回头节点
 

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 DeleteLastNode(head *Node) *Node{
   if head == nil{
      return head
   }
   temp := head
   for temp.next.next != nil{
      temp = temp.next
   }
   temp.next = nil
   return head
}
func main(){
   head := NewNode(20, NewNode(40, NewNode(80, NewNode(90, nil))))
   fmt.Printf("Input Linked list is: ")
   TraverseLinkedList(head)
   head = DeleteLastNode(head)
   fmt.Printf("Last node id deleted\nUpdated linked list:")
   TraverseLinkedList(head)
}
                                      

输出

Input Linked list is: 20 40 80 90 
Last node id deleted
Updated linked list:20 40 80