使用Golang实现反转链表,可以通过递归和迭代两种方式来实现。
1. 递归的实现方法:
首先,我们需要定义一个Node结构体,用于表示链表的节点:
type Node struct {
Val int
Next *Node
}
然后,定义一个reverse函数,用于反转链表:
func reverse(head *Node) *Node {
if head == nil || head.Next == nil {
return head
}
newHead := reverse(head.Next)
head.Next.Next = head
head.Next = nil
return newHead
}
该函数的作用是反转以head为头结点的链表,并返回新的头结点newHead。如果head为nil或head.Next为nil,直接返回head。否则,先递归反转head.Next及其后面的节点,再将head接到newHead的末尾,最后将head.Next置为nil。这样,就完成了整个链表的反转。
完整示例代码如下:
package main import "fmt"type Node struct { Val int Next *Node }func reverse(head *Node) *Node { if head == nil || head.Next == nil { return head } newHead := reverse(head.Next) head.Next.Next = head head.Next = nil return newHead }func main() { head := &Node{1, &Node{2, &Node{3, &Node{4, &Node{5, nil}}}}} newHead := reverse(head) for newHead != nil { fmt.Printf("%d ", newHead.Val) newHead = newHead.Next } }
输出结果为:
5 4 3 2 1
2. 迭代的实现方法:
也可以使用迭代的方法来反转链表。代码如下:
func reverse(head *Node) *Node {
var prev, next *Node
for head != nil {
next = head.Next
head.Next = prev
prev = head
head = next
}
return prev
}
该函数的作用是通过遍历链表,依次将每个节点的Next指针指向前一个节点,最终返回新的头结点prev。初始时,将prev和next设为nil,然后依次遍历每个节点,将其Next指针指向prev,并将prev设为当前节点,head设为next。
完整示例代码如下:
package main import "fmt"type Node struct { Val int Next *Node }func reverse(head *Node) *Node { var prev, next *Node for head != nil { next = head.Next head.Next = prev prev = head head = next } return prev }func main() { head := &Node{1, &Node{2, &Node{3, &Node{4, &Node{5, nil}}}}} newHead := reverse(head) for newHead != nil { fmt.Printf("%d ", newHead.Val) newHead = newHead.Next } }
输出结果为:
5 4 3 2 1