Golang 使用递归重新排序链表

Golang 使用递归重新排序链表

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

语法

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语言程序,并提供了两个示例。在第一个示例中,我们使用了递归方法,在第二个示例中,我们使用了递归方法和辅助函数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程