数据结构 之 链表

概念

在物理上不连续的、通过节点间的引用形成的数据结构。

所以在内存里链表是零散分配的。并不是连续内存空间。

 

链表又细分为单向链表和双向链表,主要区别在于Node节点,单向链表只持有后驱节点的引用;而双向链表持有前驱节点和后驱节点两个引用。

 

链表操作的时间复杂度

由于链表是通过Node节点的前驱和后驱节点引用实现的,当添加一个新的元素,无论添加到第几位。都只需要在被添加位的前驱节点的next指针指向被添加Node,将原来的Node作为被添加Node的next节点即可。无需遍历整个链表。所以时间复杂度是O(1)

删除同添加,只需要将被删除位的Node节点的next指针中的Node添加的被删除节点的前驱节点的next中即可。所以也是O(1)

同理O(1)

因为链表中并没有像数组一样的下标指针,所以当需要查询某个节点时,永远都需要从根节点遍历。所以查询的时间复杂度是O(n)

 

优缺点

从时间复杂度上来看,链表更适合做的是写操作,而对于随机查询的性能较差。和数组对比,他虽然内存不连续。但是也没有数组的空间限制。可以无限添加。从java遍历的角度来讲,数组结构的数据类型更适合于fori遍历,例如arrayList通过get(i)直接获取某一个元素;而如果linkedList采用fori循环,那么每次get(i)时内部还要从根节点进行一次遍历,这会使遍历退化成O(n^2)的时间复杂度。所以linkedList使用迭代器通过next的方式去访问性能更好。

你可能感兴趣的:(数据结构,Java基础,java,数据结构,链表,java)