链表原理
单向链表是一种线性表,实际上是由节点组成的,一个链表拥有不定数量的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置。由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)
}