使用递归重新排序列表的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语言程序,使用递归方法和两个示例,结合一些辅助函数来重新排序列表。在第一个示例中,我们使用了递归方法;在第二个示例中,我们使用了递归方法以及辅助函数。