对链表在上一篇博客中也有介绍一些,链表就是在主存里是分散的,不要求连续的空间。这也就导致了链表为了能够找到下一个数据元素,就必须在每个数据元素中增加一个指针指向下一个数据元素,就好像每个人手里都要抓一只信鸽,才能找到下一个人,远隔千里,也可以用这只信鸽找到下一个人。
以上的一些描述也就使得链表拥有以下特性:
1、只能顺序搜索不能随机存取。因为那些数据元素不是放在一起的,而是很分散的,并不像我们在编程中使用的那样,要小心被迷惑。实际上只是编程语言封装好了,所以我们用起来好像链表和顺序表没什么区别一样。(缺点)
2、可以很容易的拓展空间,只要主存中有空闲空间就可以增加,而不需要像顺序表那样,需要一整块的连续空间。(优点)
3、因为指针,所以存储密度比顺序表更低。例子,每个人手里都要多抓一只鸽子,体重肯定很重。(缺点)
4、可以很轻易的增加和删除元素,只要告诉鸽子换一个人就行了。人不需要移动。(优点)
综上所述,链表的适用场所就是:
1、数据元素数量不确定。
2、经常增加和删除链表中的元素。
链表也有很多种类型,最普通的单链表,和因为各种需求而产生的双链表,循环链表,循环双链表。
其实大家通过思考一个问题可以得到一些思路,就是为什么会产生顺序表?,有了顺序表又为什么会产生链表,其他的数据结构也可以如此思考,就会更清楚什么时候应该使用什么数据结构。
单链表有两种类型:
1、带头结点
2、不带头结点
所谓头结点就是一个空数据的一个首部结点,增加了这个结点之后,在对单链表的一些操作上可以统一。
在没有这个头结点的情况下,单链表插入和删除结点的时候,对头元素的操作与中间元素的操作有所不同,我们编程的时候,也要单独为头元素写一些代码。(头结点是头结点,和头元素不同,头元素和中间元素一样,都存有数据,头结点则没有存元素)
单链表实现如下:
public class LinkList
{
public class LinkNode
{
public LinkNode next = null;
public int data;
public LinkNode()
{
}
public LinkNode(int data)
{
this.data = data;
}
}
public static void main(String[] args)
{
//创建带头结点的链表
LinkNode head = new LinkNode();
LinkNode p=head;
for(int i = 0; i < 10 ; i