点击个人博客,查看更多文章https://elonjelinek.github.io
双链表的结构:一个指针指向前一个节点,另一个指针指向后一个节点。
type DoubleNode struct {
Value int
// 前一个节点,以下统称为前指针
PreNode *DoubleNode
// 后一个节点,以下统称为后指针
NextNode *DoubleNode
}
反转链表:思路为将当前节点的前指针指向其后一个节点,再将当前节点的后指针指向其前一个节点,然后将当前节点作为前节点,并将第二个节点作为当前节点,具体实现如下
func ReverseDbNode(head *DoubleNode) *DoubleNode {
// 先声明两个节点,并将两个节点都置为空,这里将两个新声明的节点都置为空,才能保证反转后的链表,头节点的前指针为空,尾节点的后指针为空
PreNode := new(DoubleNode)
NextNode := new(DoubleNode)
PreNode = nil
NextNode = nil
// head为头节点,也就是当前节点
for head != nil {
// 保存第二个节点的值
NextNode = head.NextNode
// 将当前节点的前指针,指向后一个节点,也就是把头节点的后节点变成前节点,
head.PreNode = NextNode
// 将当前节点的后指针,指向前一个节点,也就是把头节点的前节点变成后节点。
head.NextNode = PreNode
// 更新前节点,也就是把头节点变成前节点
PreNode = head
// 更新当前节点,也就是把后节点变成头节点
head = NextNode
}
return PreNode
}
打印每一个节点:
func PrintDbNode(head *DoubleNode) {
for head != nil {
//fmt.Print(head.Value, "\t")
fmt.Println(head, "\t")
// 将第二个节点替换为头节点
head = head.NextNode
}
fmt.Println()
}
在main函数中创建几个节点,并连接起来,组成一个双链表,并反转、打印,看效果如何:
func main() {
node1 := new(DoubleNode)
node2 := new(DoubleNode)
node3 := new(DoubleNode)
node4 := new(DoubleNode)
node1.Value = 1
node2.Value = 2
node3.Value = 3
node4.Value = 4
// node1为头节点,前指针为空,后指针指向node2
node1.PreNode = nil
node1.NextNode = node2
node2.PreNode = node1
node2.NextNode = node3
node3.PreNode = node2
node3.NextNode = node4
// node4位尾节点,前指针指向node3,后指针为空
node4.PreNode = node3
node4.NextNode = nil
PrintDbNode(node1)
reverseNode := ReverseDbNode(node1)
PrintDbNode(reverseNode)
}
运行结果:
&{1 <nil> 0xc42000a080}
&{2 0xc42000a060 0xc42000a0a0}
&{3 0xc42000a080 0xc42000a0c0}
&{4 0xc42000a0a0 <nil>}
&{4 <nil> 0xc42000a0a0}
&{3 0xc42000a0c0 0xc42000a080}
&{2 0xc42000a0a0 0xc42000a060}
&{1 0xc42000a080 <nil>}
Process finished with exit code 0
完整代码:
package main
import "fmt"
type DoubleNode struct {
Value int
// 前一个节点,以下统称为前指针
PreNode *DoubleNode
// 后一个节点,以下统称为后指针
NextNode *DoubleNode
}
func ReverseDbNode(head *DoubleNode) *DoubleNode {
// 先声明两个节点,并将两个节点都置为空
PreNode := new(DoubleNode)
NextNode := new(DoubleNode)
PreNode = nil
NextNode = nil
// head为头节点,也就是当前节点
for head != nil {
// 保存第二个节点的值
NextNode = head.NextNode
// 将当前节点的前指针,指向后一个节点,也就是把头节点的后节点变成前节点,
head.PreNode = NextNode
// 将当前节点的后指针,指向前一个节点,也就是把头节点的前节点变成后节点。
head.NextNode = PreNode
// 更新前节点,也就是把头节点变成前节点
PreNode = head
// 更新当前节点,也就是把后节点变成头节点
head = NextNode
}
return PreNode
}
func PrintDbNode(head *DoubleNode) {
for head != nil {
//fmt.Print(head.Value, "\t")
fmt.Println(head, "\t")
// 将第二个节点替换为头节点
head = head.NextNode
}
fmt.Println()
}
func main() {
node1 := new(DoubleNode)
node2 := new(DoubleNode)
node3 := new(DoubleNode)
node4 := new(DoubleNode)
node1.Value = 1
node2.Value = 2
node3.Value = 3
node4.Value = 4
// node1为头节点,前指针为空,后指针指向node2
node1.PreNode = nil
node1.NextNode = node2
node2.PreNode = node1
node2.NextNode = node3
node3.PreNode = node2
node3.NextNode = node4
// node4位尾节点,前指针指向node3,后指针为空
node4.PreNode = node3
node4.NextNode = nil
PrintDbNode(node1)
reverseNode := ReverseDbNode(node1)
PrintDbNode(reverseNode)
}
点击个人博客,查看更多文章https://elonjelinek.github.io