链表
线性表,但是并不会按现行的顺序储存数据,而是在每一个节点里存到下一个节点的地址。
单向链表
一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。
插入(2种)
// 给链表插入一个结点
// 编写1种插入方法,在单链表的最后加入【简单】
func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
// 1.先找到该链表的最后这个结点
// 2.建一个辅助结点【跑龙套,帮忙】
temp := head
for {
if temp.next == nil { //表示找到最后
break
}
temp = temp.next //让temp不断的指向下一个结点
}
// 3.将newHeroNode加入到链表的最后
temp.next = newHeroNode
}
- 参数:传入头结点和新节点指针地址
- 辅助变量为头结点
- 循环找到链表的最后,找到break循环,未找到让temp不断的指向下一个节点
- 将新节点加入到链表的最后
// 编写2种插入方法,根据no的编号从小到大插入【实用】
func InsertHeroNode2(head *HeroNode, newHeroNode *HeroNode) {
// 1.找到适当的结点
// 2.创建一个辅助结点【跑龙套,帮忙】
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 {
// 说明我们链表中已经有这个no,就不插入
flag = false
break
}
temp = temp.next
}
if !flag {
fmt.Println("抱歉,已经存在no=", newHeroNode.no)
return
} else {
newHeroNode.next = temp.next
temp.next = newHeroNode
}
}
- 参数:传入头结点和新节点指针地址
- 辅助变量为头结点,标志位flag为true
- 循环找到链表的最后,到链表的最后跳出,继续循环执行下一个节点
- 让插入节点的no和temp比较大小,说明newHeroNode就应该插入到temp后面
- 让插入节点的no和temp比较相等,相等就说明已经有相同的no,不插入,flag为false,跳出
- 判断标志位给出no重复提示,否则,插入新节点
删除
- 循环找到要删除节点的no,和temp的下一个节点的no比较
- 找到后改标志位跳出,判断标志位删除 temp.next = temp.next.next
双向链表
一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。