点击个人博客,查看更多文章https://elonjelinek.github.io
单链表的结构:有两个字段,第一个是节点的值,第二个是节点的指针,指针指向下一个节点
type Node struct {
Value int
NextNode *Node
}
递归反转思路:如果链表为空,就返回空;如果链表只有一个节点,就返回这个节点;如果有两个节点,就返回第二个节点,并将第二个节点的指针指向第一个节点,再将第一个节点的指针置为空,具体如下
func reverse(headNode *Node) *Node {
if headNode == nil {
return headNode
}
if headNode.NextNode == nil {
return headNode
}
var newNode = reverse(headNode.NextNode)
// 将第二个节点的指针指向头节点
headNode.NextNode.NextNode = headNode
// 将头几点的指针置为空
headNode.NextNode = nil
return newNode
}
打印链表
func PrintNode(node *Node) {
for node != nil {
//fmt.Println(node)
fmt.Print(node.Value, "--->")
node = node.NextNode
}
fmt.Println()
}
创建一个链表并测试
func main() {
var node1 = &Node{}
node1.Value = 1
node2 := new(Node)
node2.Value = 2
node3 := new(Node)
node3.Value = 3
node4 := new(Node)
node4.Value = 4
node1.NextNode = node2
node2.NextNode = node3
node3.NextNode = node4
PrintNode(node1)
reverseNode := reverse(node1)
PrintNode(reverseNode)
}
运行结果
1--->2--->3--->4--->
4--->3--->2--->1--->
完整代码
package main
import "fmt"
type Node struct {
Value int
NextNode *Node
}
func PrintNode(node *Node) {
for node != nil {
//fmt.Println(node)
fmt.Print(node.Value, "--->")
node = node.NextNode
}
fmt.Println()
}
func reverse(headNode *Node) *Node {
if headNode == nil {
return headNode
}
if headNode.NextNode == nil {
return headNode
}
var newNode = reverse(headNode.NextNode)
headNode.NextNode.NextNode = headNode
headNode.NextNode = nil
return newNode
}
func main() {
var node1 = &Node{}
node1.Value = 1
node2 := new(Node)
node2.Value = 2
node3 := new(Node)
node3.Value = 3
node4 := new(Node)
node4.Value = 4
node1.NextNode = node2
node2.NextNode = node3
node3.NextNode = node4
PrintNode(node1)
reverseNode := reverse(node1)
PrintNode(reverseNode)
}
点击个人博客,查看更多文章https://elonjelinek.github.io