如何用go语言反转双链表

本文介绍了如何使用Go语言反转双链表。通过改变每个节点的前后指针实现链表反转,并提供了具体的实现代码及运行结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击个人博客,查看更多文章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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值