目录
为什么有双向带头结点链表?:
由于单链表的操作有缺陷:
1、不能找到前驱
尾插和尾删以及中间插入删除都,找到前驱,而且不能从后往前,只能从前往后
而双向链表可以解决单链表的缺陷
双向链表有两个指针,一个指向前驱,一个指向后继:
链表可以有多种结构:
单链表、双链表
带头结点链表
循环链表 非循环链表
其他结构都是以上六种结构的组合,可以根据数据的实际情况来决定其组织形态,可以很灵活。
例如:
带头节点链表
头节点不存储数据
尾插时,直接加,不需要像链表需要进行判空处理
而对于众多的组合链表当中,最实用,结构设计最完美的是双向带头结点循环链表:
1、头插:
记录phead下一个节点first,插入的节点放到头节点和first节点中间
phead-next = newNode;
newNode -> prev = phead->next;//这两句是描述插入到头节点之后
下面就是将节点放在first之前:
newNode ->next = first;
first->prev = nweNode;
(由于这个结构特殊,不需要对空表进行判断,看图一目了然)
2、尾插:
因为最后一个节点指向头节点,头节点的前驱指向最后一个节点,所以插入时,直接将头节点前驱指向新节点
,新节点指向头节点,然后新节点前驱指向前一个节点(原来的最后一个节点),原来的最后一个节点指向新节点,连接完毕
一定要习惯画图,学会画图!
3、随机插入:
insert(List,Find(List,x))
插入很简单,就是在该位置前面插入
找到其前面prev的节点,接入;再找到后面pos的节点即pos节点,然后进行连接操作,
4、销毁链表
重复头删或者尾删即可,直到链表为空
5、判空:
6、打印
定义一个指针,从头节点开始往后遍历,到达头节点结束
8、找元素
9、头删:
记录头节点后面两个节点,一个first,一个second。phead和second连接,free first,first置空
当链表只剩下头节点时,会出错,需要进行头节点判空,用断言
10、尾删:
同样是记录最后一个节点prev和前一个节点tail = phead->prev.
然后开始交换:
前一个头节点的前驱指向prev,prev->next指向头节点
然后free最后一个节点。即tail,再tail置空