回顾链表的点点滴滴
基础
链表是比较经典的数据结构,但很多面向过程的软件用的不多,而涉及OS的代码又封装了几层,所以说用的多,但真正有机会去一窥究竟的时候却不是很多。知乎的一篇《通俗易懂讲解 链表》对链表讲述的深入浅出,是不错的入门文章。在此启发下,整理一下学习心得。
链表的单元-node or item
一般提到最多的是双向链表,链表的定义特色可以理解为,有一个携带指针的数据结构,本身携带的指针prev指向前一个链表单元,指针next指向下一个链表单元。很多英文用node表示这个单元,偶尔也会用item。
struct linked_list_item{
struct linked_list_item *prev;
struct linked_list_item *next;
}
很显然单纯的链表只是教学用的,真实的链表要有内容。
struct linked_list_item{
struct linked_list_item *item_ptr;
struct linked_list_item *prev;
struct linked_list_item *next;
}
上边这个链表引入了指针,指针上挂在链表数组,这样链表就复杂了,呵呵。
链表的极限:数组or队列
队列(queue)是从现实生活中抽象出来的概念,队列的队头和队尾,如果不看动态关系的话,用数组可以表达。但数组不能表达的是动态关系,及出队和入队对于数组来说,实现的代价太高了。而链表的prev和next指针表达了队列的单元之间的关系,也使得出队和入队的操作变得很容易。另外在数组、链表、队列、栈数据结构特点,各自优点和缺点中也非常明确的指出了几种结构的优缺点。