课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
相信大家在学习java编程开发技术的时候应该都接触过数据方面的知识与应用,而今天我们就一起来了解一下,数据结构中数组与链表的基础知识。
一、数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
1)线性表(LinearList)
顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。
2)非线性表
比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。
3)连续的内存空间和相同类型的数据
正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。
这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。
二、链表
数组和链表的区别如下:
(1)数组需要一块连续的内存空间来存储,对内存的要求比较高。
(2)链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用。
三种常见的链表结构,它们分别是:单链表、双向链表和循环链表。
1)单链表
链表通过指针将一组零散的内存块串联在一起。其中,把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。把这个记录下个结点地址的指针叫作后继指针next。
与数组一样,链表也支持数据的查找、插入和删除操作。
(1)删除一个数据是非常快速的,只需考虑相邻结点的指针改变,所以对应的时间复杂度是O(1)。
(2)链表随机访问的性能没有数组好,需要O(n)的时间复杂度。
2)循环链表
循环链表是一种特殊的单链表。实际上,循环链表也很简单。
它跟单链表的区别就在尾结点。循环链表的优点是从链尾到链头比较方便。
当要处理的数据具有环型结构特点时,就特别适合采用循环链表。比如著名的约瑟夫问题。
3)双向链表
顾名思义,它支持两个方向,每个结点不止有一个后继指针next指向后面的结点,还有一个前驱指针prev指向前面的结点。
双向链表可以支持O(1)时间复杂度的情况下找到前驱结点,正是这样的特点,也使双向链表在某些情况下的插入、删除等操作都要比单链表简单、高效。
双向链表尽管比较费内存,但还是比单链表的应用更加广泛。实际上,这里有一个更加重要的知识点需要你掌握,那就是用空间换时间的设计思想:
对于执行较慢的程序,可以通过消耗更多的内存(空间换时间)来进行优化;而消耗过多内存的程序,可以通过消耗更多的时间(时间换空间)来降低内存的消耗。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。