首页 > 其他分享 >Go 双向链表

Go 双向链表

时间:2022-09-18 17:35:40浏览次数:80  
标签:head temp no HeroNode next 链表 双向 Go

1. 双向链表的应用实例

使用带head头的双向链表实现——王者容易英雄排行榜

单向链表的缺点分析:

1)单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找

2)单向链表不能自我删除,需要靠辅助结点,而双向链表,则可以自我删除,所以前面我们单链表删除时结点,总是找到temp的下一个结点来删除的

示意图:

package main
import (
	"fmt"
)
 
// 定义一个HeroNode
type HeroNode struct {
	no int
	name string
	nickname string
	pre *HeroNode // 这个表示指向前一个结点
	next *HeroNode // 这个表示指向下一个结点
}
 
// 给双向链表插入一个结点
// 1.1 编写第2种插入写法,在单链表的最后加入
func InsertHeroNode(head *HeroNode,newHeroNode *HeroNode) {
	temp := head
	for {
		if temp.next == nil {
			break
		}
		temp = temp.next
	}
	temp.next = newHeroNode
	newHeroNode.pre = temp
}
// 给双向链表插入一个结点
// 1.2 编写第2种插入写法,根据no的编号从小到大插入[实用]
func InsertHeroNode2(head *HeroNode,newHeroNode *HeroNode) {
	temp := head
	flag := true
	for {
		if temp.next == nil {
			break
		} else if temp.next.no > newHeroNode.no {
			// 说明 newHeroNode 就应该插入到temp的后面
			break
		} else if temp.next.no == newHeroNode.no {
			// 说明我们的链表种已经有这个no,就不让插入
			flag = false
			break
		}
		temp = temp.next
	}
	if !flag {
		fmt.Println("对不起,已经存在 no=",newHeroNode.no)
		return
	}
	newHeroNode.pre = temp
	if temp.next != nil {
		newHeroNode.next = temp.next
		temp.next.pre = newHeroNode
	}
	temp.next = newHeroNode
}
// 2.1 显示--顺序
func ListenHeroNode(head *HeroNode) {
	// 1. 创建一个辅助结点[跑龙套,帮忙]
	temp := head
	if temp.next == nil {
		fmt.Println("空空如也")
		return
	}
	fmt.Println("链表如下:")
	for {
		fmt.Printf("[%d,%s,%s]",temp.next.no,temp.next.name,temp.next.nickname)
		// 判断是否为链表尾部
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
	fmt.Println()
}
// 2.2 显示--逆序
func ListenHeroNode2(head *HeroNode) {
	// 1. 创建一个辅助结点[跑龙套,帮忙]
	temp := head
	if temp.next == nil {
		fmt.Println("空空如也")
		return
	}
	for {
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
	fmt.Println("链表逆序显示如下:")
	for {
		fmt.Printf("[%d,%s,%s]",temp.no,temp.name,temp.nickname)
		// 判断是否链表头
		temp = temp.pre
		if temp.pre == nil {
			break
		}
	}
	fmt.Println()
}
 
func main() {
	// 1. 先创建一个头结点
	head := &HeroNode{}
 
	// 2. 创建一个新的HeroNode
	hero1 := &HeroNode{
		no: 1,
		name: "关羽",
		nickname: "武圣",
	}
	hero2 := &HeroNode{
		no: 2,
		name: "百里玄策",
		nickname: "电光耗子",
	}
	hero3 := &HeroNode{
		no: 3,
		name: "百里玄策",
		nickname: "电光耗子",
	}
	InsertHeroNode(head,hero1)
	InsertHeroNode(head,hero3)
	InsertHeroNode2(head,hero2)
	ListenHeroNode(head)
	ListenHeroNode2(head)
}

 

标签:head,temp,no,HeroNode,next,链表,双向,Go
From: https://www.cnblogs.com/wuchangblog/p/16705271.html

相关文章

  • Go 单向环形链表
    单向环形链表单向环形链表是一种特殊的单向链表。单向链表最后一个节点的Next指针指向空。而单向环形链表最后一个节点的Next指针指向头节点。如图所示: packa......
  • Go 学习(一) : Get started with Go
    安装gohttps://go.dev/doc/install安装以后命令行执行goversion然后随便创建一个文件,比如hello.gopackagemainimport"fmt"funcmain(){ fmt.Printl......
  • Go 单链表2
    插入节点1)、头插法packagemainimport"fmt"typeNodestruct{dataintnext*Node}funcShownode(p*Node){//遍历forp!=nil{fm......
  • 使用pymongo管理MongoDB
    基于pymongo的MongoDB系列操作,会不定时补充更新frompymongoimportMongoClientimportpymongoimportdatetime##连接本地MongoDBclient=MongoClient("mongodb:......
  • golang air 热部署
    1、安装在这里就介绍大众使用的两个版本MacOS和Windows;(建议使用第一种)//1.16可以同时使用这两种方法goget-ugithub.com/cosmtrek/air//1.16......
  • 力扣206(java&python)-反转链表(简单)
    题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=......
  • 链表二
    继上次的链表一,已经熟悉了链表大致的结构,这篇则是讲基本链表的最终形态首先来确定一下需要学习链表的哪些东西:添加、打印、寻找、删除和清除voidadd(List*pList,in......
  • 关于朋友圈出现的小米新店广告骗局(非法获取个人消息)木马通过广东政务服务网(tyrz.gd.g
     前两天在朋友圈突然看到有发小米新店开业送千台扫地机器人的广告,出于天上不会掉馅饼到我身上的原则我选择忽略了,但是没多久看到他又晒了个物流订单,于是还是点开看......
  • go-cqhttp调用接口
    目录调用接口一、概述1、简介2、接口二、接入权限系统1、智能聊天2、戳一戳3、新成员三、调用接口1、查找接口2、调用接口3、接入机器人调用接口一、概述1......
  • 第六章 MongoDB数据库开发
    FireDAC也在DX10的版本中开始加入支持NoSQL型态的数据库,并选择其中最为流行的MongoDB为第1个支持的目标。MongoDB的数据体结构是以 (Key,Value)组合的,储存的方式是使......