Go 语言程序:从链表中删除元素


在 Go 中,链表是一种线性数据结构,其元素通过指针连接,从第一个节点(头节点)到最后一个节点(尾节点),可以依次访问每个节点。我们将通过两个示例来演示从链表中删除元素的程序。第一个示例使用节点结构体,第二个示例使用哑节点。

方法 1:使用节点结构体

此代码创建了一个 Node 结构体,它有两个字段:Value 和 Next,后者链接到列表中的下一个节点。remove_node 方法从列表中删除具有指定值的节点,并返回列表的新头节点。它接受列表的头节点和要删除的值作为参数。

算法

  • 步骤 1 − 创建一个名为 main 的包,并在程序中声明 fmt(格式化包)。main 包生成可执行代码,fmt 包帮助格式化输入和输出。

  • 步骤 2 − 创建一个节点结构体,其中 value 字段类型为 int,next 字段类型为 node。

  • 步骤 3 − 创建一个名为 remove_node 的函数,并在该函数中检查头节点是否为空。如果是,则返回 nil。

  • 步骤 4 − 检查头节点的值是否与要删除的值匹配。如果是,则返回列表中的下一个节点。

  • 步骤 5 − 在下一步中,将头节点设置为当前节点的指针。

  • 步骤 6 − 然后,遍历列表,直到下一个节点不为空。

  • 步骤 7 − 更新当前节点的 next 指针以跳过下一个节点,如果下一个节点的值等于要删除的值,则结束循环。

  • 步骤 8 − 将下一个节点设置为当前节点的指针。

  • 步骤 9 − 将头节点返回到下一个函数。

  • 步骤 10 − 在 main 函数中,打印从链表中删除元素后的当前值。

示例

在此示例中,我们将使用节点结构体从链表中删除元素。

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 − 创建一个名为 main 的包,并在程序中声明 fmt(格式化包)。main 包生成可执行代码,fmt 包帮助格式化输入和输出。

  • 步骤 2 − 创建一个 Node 结构体,其中 num_value 字段类型为 int,Next 字段类型为 Node。

  • 步骤 3 − 创建一个名为 remove_node 的函数,它有两个输入参数:head 和 value。然后,创建一个哑节点,并将它的 next 字段设置为列表的头节点。

  • 步骤 4 − 创建一个名为 prior 的节点指针,指向哑节点。

  • 步骤 5 − 在下一步中,遍历列表,直到下一个节点不为空。

  • 步骤 6 − 更新前一个节点的 next 指针以跳过下一个节点,如果下一个节点的值与要删除的值相同,则结束循环。

  • 步骤 7 − 然后,将前一个节点指针移动到下一个节点。

  • 步骤 8 − 删除具有指定值的节点后,列表的头节点作为哑节点的 next 字段。

  • 步骤 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

结论

我们使用两个示例演示了从链表中删除元素的程序。在第一个示例中,我们使用了节点结构体,在第二个示例中,我们使用了哑节点来执行程序。

更新于: 2023年2月20日

672 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告