使用递归重新排序列表的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语言程序,使用递归方法和两个示例,结合一些辅助函数来重新排序列表。在第一个示例中,我们使用了递归方法;在第二个示例中,我们使用了递归方法以及辅助函数。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP