1.定义
讲数据结构就离不开讲链表。因为数据结构是用来组织数据的,如何将一个数据关联到另外一个数据呢?链表可以将数据和数据之间关联起来,从一个数据指向另外一个数据。
链表由一个个数据节点组成的,它是一个递归结构,它存在一个指向另外一个数据节点的引用。
1.1示例
package main
import "fmt"
type LinkNode struct {
Date string
NewNode *LinkNode
}
func main() {
// 新节点
node := new(LinkNode)
node.Date = "凉冰"
// 新节点
node1 := new(LinkNode)
node1.Date = "Felix"
node.NewNode = node1 //node1 连接到node的节点上
// 新节点
node2 := new(LinkNode)
node2.Date = "khaos"
node1.NewNode = node2
// 新节点
node3 := new(LinkNode)
node3.Date = "酸萝卜"
node2.NewNode = node3
nowNode := node
for {
if nowNode !=nil{
//打印下个节点
fmt.Println(nowNode.Date)
//获取下一个节点
nowNode = nowNode.NewNode
}else {
break
}
}
}
打印出
凉冰
Felix
khaos
酸萝卜
结构体 LinkNode 有两个字段,一个字段存放数据 Data ,另一个字典指向下一个节 点 NextNode 。这种从一个数据节点指向下一个数据节点的结构,都可以叫做链表。
1.2 其他形式链表
双链表,每个节点既可以找到它之前的节点,也可以找到之后的节点,是双向的。
type LinkNode2 struct {
Date string
UpNode *LinkNode
NextNode *LinkNode
}
循环链表,就是它一直往下找数据节点,最后回到了自己那个节点,形成了一个回路。循 环单链表和循环双链表的区别就是,一个只能一个方向走,一个两个方向都可以走, 只需要将循环链表的首位链接起来。
node3.NewNode=node
2. 数据操作
2.1 添加节点
func addNode(head *LinkNode,Node LinkNode,addNode *LinkNode){
temp := head //定义头节点
for {
if temp.Date == Node.Date{
break
}
temp = temp.NewNode //temp不断指向下一个节点
}
addNode.NewNode = temp.NewNode
temp.NewNode = addNode
}
定义头节点 head,以及添加的位置Node,添加的节点addNode 首先遍历找到添加节点的位置,之后使添加的节点先指向下一个节点,再当前节点指向添加的节点。 此时要注意先后顺序如先使当前节点指向添加的节点,就会导致链表后面的节点无法被指向。 注意单项链表可以出现的空指针的情况,循环链表出现的找不到要插入节点的情况
2.2 删除节点
func DelNode(head *LinkNode,delNode *LinkNode) {
temp := head //定义头节点
for {
if temp.NewNode.Date == delNode.Date{
break
}
temp = temp.NewNode //temp不断指向下一个节点
}
temp.NewNode=temp.NewNode.NewNode
}
值得注意的是如果当前节点已经到要删除的节点时,单向链表是无法使得前一节点的指针跳过当前节点。
3.总结
3.1 链表的优点
链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素 添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;
3.2 链表的缺点
因为含有大量的指针域,占用空间较大; 查找元素需要遍历链表来查找,非常耗时。
我们是程序员khaos,一群酷爱编程,乐于分享的小伙子,下期见~
「分享」「点赞」「在看」是最大支持