golang链表demo
一、链表是什么
链表属于线性表,是一种由多个节点组成的结构,各个节点的内存地址不一定连续。除了头节点和尾节点外,每个节点中,除了自己的数据外,都保存着其他1-2个节点的地址。
二、常用链表的分类
1. 单向链表
在单向链表中,尾节点没有记录任何节点的地址,其余节点记录了下一个节点的地址。
如图是一个单向链表:
在这个单向链表中,d是尾节点,它没有记录任何节点的地址;a、b、c则都记录了自己后面一个节点的地址。
2. 双向链表
在双向链表中,尾节点记录了上一个节点的地址,头节点记录了下一个节点的地址;其余节点记录了前一个和后一个节点的地址。
如图是一个双向链表:
在这个双向链表中,a是头节点,它只记录了下一个节点的地址,d是尾节点,它只记录了上一个节点的地址;其余节点则记录了上下两个节点的地址。
3. 循环链表
循环链表并不独立于前面2种链表,它更像是它们的变种。循环链表指的是:尾节点中保存节点中某一个节点的地址,从而形成了一个环。例如,我们可以把上面的单向链表稍稍改造一下,让尾节点d中记录头节点a的地址:
当然,尾节点不一定非要记录头节点才叫循环链表,d中记录b、c节点,也算是循环链表。
三、对链表进行crud的方法
-
查询节点
头节点的地址我们是知道的,顺着头节点,依次往下遍历即可 -
增加节点
a. 在单向链表中,找到尾节点,直接在尾节点中保存新节点的地址即可。如下图:
b. 在双向链表中,找个ab两个节点(a在前,b在后),在新节点中保存a、b的地址并在b中把a的地址改成新节点,再在a中把c的地址改成新节点,即可。注意一定要先在新节点中保存b的地址,否则会导致b节点的地址丢失,进而导致链表数据丢失。如下图:
-
删除节点:假设要在abc中,删除b节点
a. 在单向链表中,把c的地址保存在a中,即可。如下图:
b. 在双向链表中,在c中把b的地址改成a的,再在a中把b的地址改为c的,即可。注意一定要先改c中的数据,否则会导致b节点的地址丢失,进而导致链表数据丢失。如下图:
-
修改节点
找到节点,修改数据即可
结语
数据结构和算法的demo及部分面试题的答案都在这里:https://github.com/Eleven9527/dataStructureAndAlgorithmLearning
专栏和项目都会陆续更新,路过的朋友帮忙star一下,不胜感激!
我是一名正在路上的程序员,希望与你一起攀登技术的高峰~