单向链表:
由两部分组成:数据域和指针域,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为null,对单链表的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。
双向链表:
对于双向链表来说,它的每个节点要指向“直接前驱”和“直接后继”,所以节点类需要含有两个指针域。指向直接前驱的指针使用pre表示,指向后继的指针使用next表示。双向链表是在单向链表基础上的一个改进,每个节点指向其直接前驱和直接后继节点。因此,从双向链表的任意位置开始,都能访问所有的节点。
双向链表从节点的结构上可以看出,双向链表的所需的存储空间大于单向链表。同时,对于插入和删除等操作来说,双向链表的节点操作更加复杂,涉及到节点的前后两个节点。
代码实现可见:https://zhuanlan.zhihu.com/p/109926262
|
单向链表 |
双向链表 |
查找 |
只能找到后继 |
找到前驱和后继 |
遍历 |
只能从头到尾遍历,但遍历时候不会死循环 |
可进可退,但遍历复杂 |
增删节点 |
增加删除节点简单 |
增加删除节点复杂 |
内存 |
相比较小 |
多分配一个前驱指针存储空间 |
适用场合 |
节点的增加删除频繁,内存较小场合 |
需要双向查找节点值的场合 |