ITPub博客

首页 > 区块链 > 区块链 > Golang数据结构--双向循环链表实现

Golang数据结构--双向循环链表实现

原创 区块链 作者:lsq_008 时间:2022-10-09 12:31:39 0 删除 编辑
package main

import "fmt"

//定义一个双向链表系欸但
type HeroNode struct {
    no       int
    name     string
    nickname string
    next     *HeroNode
    pre      *HeroNode
}

//插入链表节点,从前往后搜索
func InertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
    //从头部开始遍历,找到对应的位置后插入节点
    temp := head
    for {
        if temp.next == nil || temp.next == head {
            break
        } else if temp.next.no > newHeroNode.no {
            break
        }
        temp = temp.next
    }
    newHeroNode.pre = temp
    if temp.next != nil {
        temp.next.pre = newHeroNode
        newHeroNode.next = temp.next

    } else {
        head.pre = newHeroNode
        newHeroNode.next = head
    }
    temp.next = newHeroNode

}

// //链表删除节点
func DeleteHeroNode(head *HeroNode, NodeNo int) {
    temp := head
    for {
        if temp.next == nil || temp.next == head {
            fmt. Println( "没有找到该节点!")
            return
        }
        if temp.next.no == NodeNo {
            fmt. Println( "需要删除的节点信息:")
            ListSingleNode(head, NodeNo)
            break
        }
        temp = temp.next
    }
    //开始删除该节点
    if temp.next.next != nil || temp.next.next != head {
        temp.next = temp.next.next
        temp.next.pre = temp
    } else {
        temp.next = head
        head.pre = temp.next
    }

    fmt. Println( "删除节点成功")
}

//显示指定节点号的节点信息
func ListSingleNode(head *HeroNode, NodeNo int) {
    temp := head
    for {
        if temp.next == nil || temp.next == head {
            fmt. Println( "没有找到该节点信息!")
            return
        }
        if temp.next.no == NodeNo {
            break
        }
        temp = temp.next
    }
    fmt. Printf( "Node info: [ %d , %s , %s ]", temp.next.no, temp.next.name, temp.next.nickname)
}

//显示链表所有节点信息
func ListHeroNode(head *HeroNode) {
    //1.创建一个辅助节点
    temp := head
    //先判断该链表是不是一个空的链表
    if temp.next == nil {
        fmt. Println( "空空如也。。。")
        return
    }
    //2.遍历这个链表
    fmt. Printf( "head:[next --> %p ,pre --> %p ,self --> %p ] \n ", head.next, head.pre, head)
    for {
        fmt. Printf( "[ %d , %s , %s ,next --> %p ,pre --> %p ,self --> %p ] \n ", temp.next.no,
            temp.next.name, temp.next.nickname, temp.next.next, temp.next.pre, temp.next)
        //判断是否队尾
        temp = temp.next
        if temp.next == nil || temp.next == head {
            break
        }
    }
    fmt. Println()
}

func main() {
    //1.先创建一个头节点
    head := &HeroNode{no: - 1}
    //2.创建一个hero节点
    hero1 := &HeroNode{
        no:       1,
        name:     "宋江",
        nickname: "及时雨",
    }
    hero2 := &HeroNode{
        no:       2,
        name:     "卢俊义",
        nickname: "玉麒麟",
    }
    hero3 := &HeroNode{
        no:       4,
        name:     "吴用",
        nickname: "智多星",
    }

    hero4 := &HeroNode{
        no:       3,
        name:     "林冲",
        nickname: "豹子头",
    }
    hero5 := &HeroNode{
        no:       5,
        name:     "鲁智深",
        nickname: "花和尚",
    }
    //3.加入
    InertHeroNode(head, hero1)
    InertHeroNode(head, hero2)
    InertHeroNode(head, hero3)
    //4.显示
    ListHeroNode(head)
    //5。插入no为3的节点,观察结果是否正确
    InertHeroNode(head, hero4)
    ListHeroNode(head)
    InertHeroNode(head, hero5)
    ListHeroNode(head)
    //6。删除节点信息
    var NodeNo int
    fmt. Println( "请输入需要删除的节点号:")
    fmt. Scanf( " %d ", &NodeNo)
    DeleteHeroNode(head, NodeNo)
    fmt. Println( "当前节点信息:")
    ListHeroNode(head)

}


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10972173/viewspace-2917363/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    335
  • 访问量
    1369116