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