单链表和双链表

数组的元素个数必须事先制定并且一旦指定之后不能更改,解决这个缺陷的办法就是链表,几乎可以这样理解:链表就是一个元素个数可以实时变大/变小的数组。

链表是什么样的?它是由一个一个结构完全类似的节点构成的,节点中有一些内存可以用来存储数据(所以叫表,表就是数据表),这里的链指的是链接各个表的方法。在C语言中用来连接2个表(其实就是2块内存)的方法就是指针。

节点是由用来存储信息完成任务的有效数据和用于指向链表的下一个节点的首地址的指针组成。

一个典型的链表的实现就是:头指针指向链表的第1个节点,然后第1个节点中的指针指向下一个节点,依次类推直到最后一个节点(最后一个节点指针指向NULL表示结束(创建节点的时候就已经指向了NULL),或者指向自己)。这样就构成了一个链。

链表还有另外一种用法,就是把头指针指向的第一个节点作为头节点使用(把原来第二个节点当作第一个节点来使用了,依次往后。这样的话头节点就是空的。即头节点+空节点+第一个节点…)。头节点的特点是:第一,它紧跟在头指针后面。第二,头节点的数据部分是空的(有时候不是空的,而是写程序的时候让其用来存储整个链表的节点数,数字可以随着节点的增减而增减,当我们想知道链表有多大的时候直接去读这个数就行了),指针部分指向下一个节点,也就是第一个节点。

链表有没有头节点是不同的。体现在链表的插入节点、删除节点、遍历节点、解析链表的各个算法函数都不同。所以如果一个链表设计的时候就有头节点那么后面的所有算法都应该这样来处理;如果设计时就没有头节点,那么后面的所有算法都应该按照没有头节点来做。实际编程中两种链表都有人用,所以大家在看别人写的代码时一定要注意看它有没有头节点。

单链表的节点 = 有效数据 + 指针(指针指向后一个节点),因此单链表各个节点之间只由一个指针单向链接,这样实现有一些局限性。解决办法就是:双链表,双向链表的节点 = 有效数据 + 2个指针(一个指向后一个节点,另一个指向前一个节点)。也有头指针和头节点。

猜你喜欢

转载自blog.csdn.net/weixin_42325069/article/details/84147522