Go: 用go编写一个双向链表实现增删功能

前序

区块链一直是人们的热门话题,但是其实所谓区块链就是将结构体按照出现的次序进行了串联,从而形成了区块链。现实中的区块链的块,是规定了块的大小,以及当前区块的哈希值和上一区块的哈希值,并且只有与上一区块的哈希值相一致,才可以加入到区块链中。本文只是简单的介绍区块的基本构造以及简单加入链中。

这里我们假设一个块就是一个节点,并将这些节点一个一个的加入,可实现插入或者删除的功能,及顺序显示和逆序显示,如下为实现的代码:


代码

package main

import (
	"fmt"
)

//定义一个人的节点peopleNode
type HumanNode struct {
	id       int
	name     string
	pre      *HumanNode //表示指向前一个节点
	next     *HumanNode //表示指向下一个节点
}
//插入
func InsertNode(head , newNode *HumanNode) {
	//先找到该链表的最后这个节点
	//再创建一个临时辅助节点
	temp := head
	//让插入的节点的id,与temp的下一个节点的id比较
    //flag: 初始值为true,这里也可以用int类型的1 或 0 来表示
	flag := true 
	for {
		if temp.next == nil {//说明已经到了链表的最后
			break
		} else if temp.next.id > newNode.id {
			//说明newNode 就应该插入到temp后面
			break
		} else if temp.next.id == newNode.id {
			//说明链表中已经有这个id. 就不能再插入
			flag = false
			break
		}
		temp = temp.next //让temp不断的指向下一个节点
	}
	if !flag {
		fmt.Printf("the Id:%d existed and can not be inserted",newNode.id)
		return
	} else {
		newNode.next = temp.next //先将newNode.next指向temp.next 
		newNode.pre = temp //再将newNode.pre(前一个指针)指向temp
		if temp.next != nil { //判断如果temp.next后面没有了
			temp.next.pre = newNode //就直接加在尾部,即newNode.Pre=temp
		}
		temp.next = newNode
	}	
}
//删除
func DelNode(head *HumanNode, id int) {

	//需要找到该链表的最后这个节点
	//先创建一个辅助节点,将辅助节点指向head
	helper := head
	//找到要删除的节点id,与temp的下一个节点的id比较
	flag := false
	for {
		if helper.next == nil {//说明已经到了链表的最后
			break
		}else if helper.next.id == id {
			flag = true
			break
		} 
		helper = helper.next //move on next node
	}
	if flag {
		fmt.Printf("the No:%d is found and remove it...\n",id)
        //先将要删除的节点helper的next指针指向,helper.next的下一个节点
		helper.next = helper.next.next 
		if helper.next != nil { //即如果helper.next不为空
			//将helper.next的前一个指针直接指向helper,即跳过了要被删除的节点
            helper.next.pre = helper 
		}
		return
	} else {
		fmt.Println("no such id can be found...")	
	}
}

//正序显示
func ShowAllNodeByOrder(head *HumanNode) {
	//创建一个临时节点
	temp := head
	//先判断该链表是不是一个空链表
	if temp.next == nil {
		fmt.Println("empty link ...")
		return
	}
	//遍历这个链表
	for {
		fmt.Printf("[%d, %s] ==>",temp.next.id,temp.next.name)
		//判断是否为链表尾了
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
	println()
}

//倒序显示
func ShowAllNodeByReverse(head *HeroNode) {
	temp := head
	if temp.next == nil {
		fmt.Println("empty link ...")
		return
	}
	//先将temp定位到最后
	for {
		if temp.next == nil {
			break
		}
		temp = temp.next
	}
	//遍历这个链表
	for {
		fmt.Printf("[%d, %s] ==>",temp.no,temp.name)
		//判断是否为链表的首位
		temp = temp.pre
		if temp.pre == nil {
			break
		}
	}
	println()
}

func main() {
	//创建一个头结点
	head := &HumanNode{}
	//创建一个新的HumanNode
	humanNode1 := &HumanNode{
		id : 1,
		name :"wang",
	}
	humanNode2 := &HumanNode{
		id : 2,
		name :"zhang",
	}
	humanNode3 := &HumanNode{
		id : 3,
		name :"zhao",
	}
	humanNode4 := &HumanNode{
		id : 4,
		name :"zhou",
	}
	humanNode5 := &HumanNode{
		id : 5,
		name :"song",
	}
	//简单加入节点(如果是真的区块链,则需将前一个区块的哈希值与当前区块的pre的哈希值进行比较)
	InsertNode(head,humanNode2)
	InsertNode(head,humanNode4)
	InsertNode(head,humanNode1)
	InsertNode(head,humanNode5)
	InsertNode(head,humanNode3)

	//显示
	fmt.Println("顺序显示:")
	ShowAllNodeByOrder(head)
	fmt.Println("逆序显示:")
	ShowAllNodeByReverse(head)

	//删除
	DelNode(head,5)	

	ShowAllNodeByOrder(head)	
}

结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值