使用递归重新排序列表的Go语言程序


链表是一种数据结构,由节点集合组成,每个节点包含一个值和指向列表中下一个节点的指针。在这篇Go语言文章中,我们将学习如何使用递归和一些辅助函数来重新排序列表。

语法

func reorderList(head *Node) {…}

reorderList() 函数用于使用递归重新排序列表。它以指向头节点的指针作为参数。

算法

  • 步骤1 − 首先,我们需要导入 fmt 包。

  • 步骤2 − 现在,创建一个名为 Node 的链表单个节点的结构体。它包含两个成员,一个用于保存节点的数据值,另一个是用于指向列表中下一个节点的指针。

  • 步骤3 − 现在,创建一个名为 reorderList() 的函数,该函数以链表的头节点作为输入,并修改列表以重新排序。它使用递归来实现此功能。

  • 步骤4 − 检查链表是否为空或只包含一个节点,则无需重新排序。

  • 步骤5 − 然后,使用 findMiddle 辅助函数查找链表的中间位置。它使用双指针技术。

  • 步骤6 − 接下来,使用 reverselist 辅助函数反转列表的后半部分。它接受列表后半部分的头节点,并返回反转后的列表的头节点。

  • 步骤7 − 然后,使用 mergeLists 辅助函数合并链表的前半部分和反转后的后半部分。合并后的列表将是重新排序后的列表。

  • 步骤8 − 最后,将输入链表的头节点更新为重新排序后的列表的头节点。

  • 步骤9 − 启动 main() 函数。在 main() 函数内部,向链表添加节点。

  • 步骤10 − 现在,调用 reorderList() 函数重新排序列表并打印更新后的列表。

  • 步骤11 − 此外,通过调用 printList() 函数,在屏幕上打印使用递归生成的最终更新的重新排序链表。

示例1:使用递归重新排序列表的Go语言程序

在这个例子中,我们将定义一个使用递归的 reorderList() 函数,用于重新排序单链表。

package main

import "fmt"

type Node struct {
   Val  int
   Next *Node
}

func reorderList(head *Node) {
   if head == nil || head.Next == nil || head.Next.Next == nil {
      return
   }

   fast, slow := head, head
   for fast.Next != nil && fast.Next.Next != nil {
      fast = fast.Next.Next
      slow = slow.Next
   }

   secondHalf := slow.Next
   slow.Next = nil
   var prev *Node
   for secondHalf != nil {
      next := secondHalf.Next
      secondHalf.Next = prev
      prev = secondHalf
      secondHalf = next
   }

   p1, p2 := head, prev
   for p2 != nil {
      next1, next2 := p1.Next, p2.Next
      p1.Next = p2
      p2.Next = next1
      p1, p2 = next1, next2
   }
}

func printList(head *Node) {
   for head != nil {
      fmt.Printf("%d ->", head.Val)
      head = head.Next
   }
   fmt.Println("nil")
}

func main() {
   head := &Node{Val: 8, Next: &Node{Val: 7, Next: &Node{Val: 3, Next: &Node{Val: 4, Next: nil}}}}
   fmt.Println("Initial Ordered list:")
   printList(head)
   reorderList(head)
   fmt.Println("Updated Reordered list:")
   printList(head)
}

输出

Initial Ordered list:
8 -> 7 -> 3 -> 4 -> nil
Updated Reordered list:
8 -> 4 -> 7 -> 3 -> nil 

示例2

在这个例子中,我们将定义一个使用递归的 reorderList() 函数,该函数在辅助函数的帮助下用于重新排序单链表。

package main

import "fmt"

type Node struct {
   Val  int
   Next *Node
}

func reorderList(head *Node) {
   if head == nil || head.Next == nil {
      return
   }

   var prev *Node
   slow, fast := head, head

   for fast != nil && fast.Next != nil {
      prev = slow
      slow = slow.Next
      fast = fast.Next.Next
   }

   prev.Next = nil
   secondHalf := reverseList(slow)

   mergeLists(head, secondHalf)
}

func reverseList(head *Node) *Node {
   if head == nil || head.Next == nil {
      return head
   }

   newHead := reverseList(head.Next)
   head.Next.Next = head
   head.Next = nil

   return newHead
}

func mergeLists(l1, l2 *Node) {
   for l1 != nil {
      l1Next := l1.Next
      l2Next := l2.Next

      l1.Next = l2
      if l1Next == nil {
         break
      }

      l2.Next = l1Next
      l1 = l1Next
      l2 = l2Next
   }
}

func printList(head *Node) {
   for head != nil {
      fmt.Printf("%d ->", head.Val)
      head = head.Next
   }
   fmt.Println("nil")
}

func main() {
   head := &Node{Val: 5, Next: &Node{Val: 7, Next: &Node{Val: 3, Next: &Node{Val: 2, Next: &Node{Val: 4, Next: nil}}}}}
   fmt.Println("Initial Ordered list:")
   printList(head)

   reorderList(head)

   fmt.Println("Updated Reordered list:")
   printList(head)
}

输出

Initial Ordered list:
5 -> 7 -> 3 -> 2 -> 4 -> nil
Updated Reordered list:
5 -> 4 -> 7 -> 2 -> 3 -> nil

结论

我们已经成功编译并执行了一个Go语言程序,使用递归方法和两个示例,结合一些辅助函数来重新排序列表。在第一个示例中,我们使用了递归方法;在第二个示例中,我们使用了递归方法以及辅助函数。

更新于:2023年5月10日

浏览量:156

启动您的职业生涯

完成课程后获得认证

开始
广告