数据结构之Go实现单链表

链表原理

单向链表是一种线性表,实际上是由节点组成的,一个链表拥有不定数量的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置。由N各节点(Node)组成单向链表,每一个Node记录本Node的数据及下一个Node。向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。

代码实现

定义链表结构

package main

import (
	"fmt"
)

type HeroNode struct {
	no int
	name string
	nickname string
	next *HeroNode
}

插入链表

func InsertHeroNode(head *HeroNode,newHeroNode *HeroNode) {
	//找到适当的节点
	temp := head
	flag:=true
	//让插入的节点no,和temp的下一个节点的no比较
	for {
		if temp.next==nil{//说明到链表最后了
		break
	}else if temp.next.no>newHeroNode.no{
		//说明newheronode应该插入到temp的后面
		break
		}else if temp.next.no==newHeroNode.no{
			//说明链表里面已经有了
			flag=false
			break
		}
		temp=temp.next

}
if !flag{
	fmt.Println("对不起,已经存在no=",newHeroNode.no)
	return
	}else {
		newHeroNode.next=temp.next
		temp.next=newHeroNode
}
}

删除链表节点

func DelHerNode(head *HeroNode,id int ){
	temp:=head
	flag:=false
	//找到要删除的节点,
	for {
		if temp.next==nil{//说明到链表最后了
			break
		}else if temp.next.no==id{
			//说明链表里面已经有了
			flag=true
			break
		}
		temp=temp.next

	}
	if flag{
		temp.next=temp.next.next
	}else{
		fmt.Println("要删除的ID不存在",id)
	}
}

显示链表节点

func ListHerNode(head *HeroNode){
	temp:=head
	//先判断该链表是不是一个空的链表
	for{
		if temp.next==nil{
			fmt.Println("空空乳液")
			return
		}
		for{
			fmt.Printf("[%d,%s,%s]==>",temp.next.no,
				temp.next.name,temp.next.nickname)
			//判断是否链表后
			temp=temp.next
			if temp.next==nil{
				break
			}
		}
	}

}

主函数实现

func main(){
	//先创建一个头结点
	head:=&HeroNode{}

	//床架一个新的Heronode
	hero1:=&HeroNode{
		no:1,
		name:"悟空",
		nickname:"美猴王",


	}
	hero2:=&HeroNode{
		no:2,
		name:"八戒",
		nickname:"天蓬",
	}
	hero3:=&HeroNode{
		no:3,
		name:"沙和尚",
		nickname:"无能",
	}
	InsertHeroNode(head,hero1)

	InsertHeroNode(head,hero2)
	InsertHeroNode(head,hero3)
	ListHerNode(head)
	fmt.Println()
	//DelHerNode(head,2)

	ListHerNode(head)
}

猜你喜欢

转载自blog.csdn.net/weixin_43318506/article/details/106234647