Golang程序:在给定链表的第K个节点后插入新节点


2022年5月2日, Learn eTutorial
1590

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

链表是一种线性数据结构,由一系列节点组成,每个节点都有两个属性:数据和下一个指针。这里的“下一个”是指向列表中下一个节点的指针。有许多链表操作允许我们对链表执行不同的操作。例如,插入操作将向链表添加一个新节点。

在这个程序中,我们将创建一个单向链表,并在列表的第K个节点之后添加一个新节点。为了完成此任务,我们将通过遍历列表直到头节点变为nil来找到第k个节点。如果我们在列表中找到第k个节点,则通过在第k个节点之后添加一个新节点来更新链表。让我们更详细地了解这个程序。

如何在第K个节点后插入新节点

在本程序中,我们将重点关注如何使用GO语言在给定链表的第 k 个值节点之后添加新节点。

有一个 **fmt** 包,用于将一些标准库导入到程序中。使用内置函数 fmt.println() 在屏幕上打印任何内容,使用 fmt.scanln() 读取数据。这些函数在 **fmt** 包中定义。因此,我们需要导入“**fmt**”包才能使用这些函数。之后,打开主函数。我们将在主函数中完成整个程序,主函数是我们程序的起点。

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

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

现在你有一个链表了。无论何时你想在给定链表的第 k 个节点后添加一个节点,使用 fmt.scanln 读取你想要作为第一个节点添加的数据,并将其传递给函数 AddAfterKthNode。这个函数定义了一个方法,它接受链表的头部和输入值。它检查 **head** 是否等于 nil,这意味着列表是否为空。如果 head 等于 nil,则不添加任何节点直接返回 **head**。否则,通过在第 k 个节点后添加一个新节点来更新链表。为此,遍历到新节点所需位置的前一个节点。如果找到第 k 个值位置,则为新节点分配内存并存储数据。更改 next 指针以在链表的第 k 个节点后包含一个新节点。最后,将链表的头部返回到主函数。你可以通过调用函数 TraverseLinkedList 来显示更新后的链表。

下面是Go程序中用于在给定链表的第k个节点之后添加新节点的步骤。

算法

步骤 1:开始
步骤 2:定义一个节点结构体
步骤 3:通过调用函数 NewNode() 创建一个链表。这里的 head 是链表的起始节点。
步骤 4:调用函数 TraverseLinkedList(head) 显示输入的链表。
步骤 5:读取要作为 **item** 插入链表的新数据。
步骤 6:通过调用 head = AddAfterKthNode(head, 10, item) 将新节点添加到链表的第k个节点之后。
步骤 7:通过调用函数 TraverseLinkedList(head) 显示更新后的链表。
步骤 8:退出

实现 NewNode(value int) 的步骤

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

实现 TraverseLinkedList(head *Node) 的步骤

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

实现 AddAfterKthNode(head *Node, k, data int) 的步骤

步骤 1:定义一个接受链表 head 的方法。
步骤 2:检查头节点是否为空,这意味着列表为空。如果 head == nil,则不添加任何节点直接返回 **head**。否则执行步骤 3。
步骤 3:定义一个节点 temp,它最初将指向列表的头部。
步骤 4:遍历列表,直到 temp 指向 nil。
步骤 5:在每次迭代中,检查 temp 是否会指向第 k 个值节点。如果是,请执行以下步骤:

  • 定义新节点 **ptr**
  • 新节点 **ptr** 将插入到第 k 个节点之后,这样 **temp** 将指向新节点 **ptr**,而 **ptr** 将指向 **temp**。

步骤 6:返回 **head**。
 

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 AddAfterKthNode(head *Node, k , data int) *Node{
  if head == nil{
      return head
   }
   temp := head
   for temp != nil{
      if temp.value == k{
         ptr := NewNode(data, nil)
         ptr.next = temp.next
         temp.next = ptr
         break
      }
      temp = temp.next
   }
   return head
}
func main(){
   head := NewNode(30, NewNode(10, NewNode(80, NewNode(40, nil))))
   fmt.Printf("Input Linked list is: ")
   TraverseLinkedList(head)
   var item int;
   fmt.Printf ("\nEnter the item which you want to insert?\n") 
   fmt.Scan(&item;)

   head = AddAfterKthNode(head, 10, item)
   fmt.Printf("Updated Linked List by Inserting New Node After %dth Value Node:\n", 10)
   TraverseLinkedList(head)
}

                                      

输出

Input Linked list is: 30 10 80 40 

Enter the item which you want to insert?
75
Updated Linked List by Inserting New Node After 10th Value Node:
 30 10 75 80 40