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)
}