go語言遞迴反轉單鏈表
阿新 • • 發佈:2018-12-09
單鏈表的結構:有兩個欄位,第一個是節點的值,第二個是節點的指標,指標指向下一個節點
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)
}