声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。
前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文是上篇文章Java数据结构与算法——链表的扩展篇,介绍链表的特色,使用场景、链表的性能分析以及一道经典的链表面试题——链的反转问题java
链表因为其特殊的存储结构,其物理存储空间不连续,所以须要额外的信息(指针)标记下一节点的地址,优势是可利用操做系统的动态内存管理,缺点除存储数据自己以外须要额外的开销存放指针。面试
和数组不一样,链表能够动态的添加元素和删除元素,弥补了数组的缺陷算法
很显然,查找须要遍历,最差的状况若是查找最后一个,则比较低效特别是链表比较长的时候。链表的增删只须要操做指针便可,相比数组比较高效segmentfault
增删频繁的场合(随着计算机技术的发展,空间已经再也不是主要矛盾,时间效率才是)
若是同时存在即增删又查找的场合,通常链表会配合散列表、栈、队列一块儿使用。数组
链表的插入分为头插入
、尾插入
、中间插入
,头和尾的时间复杂度尾O(1),而中间插入须要遍历,因此时间复杂度尾O(L),L为链表长度。数据结构
一样删除也分为头删除
、尾删除
、中间删除
,头删除的时间复杂度是O(1),中间删除和尾删除因为须要遍历链表,因此时间复杂度为O(L),L为链表长度。性能
链表的查找,因为须要遍历,因此时间复杂度为O(L),L为链表长度。测试
这是一道面试中常常出现的题,通常在面试中要求尽可能不用额外的空间实现。方法有不少,好比遍历链表,而后依次使用头插入的方式。还有一种方法,就是把链表的每一个指针反转。操作系统
/** * 反转链表 */ public void lindRevese(){ Node temp = first; last = temp; Node next = first.getNext(); for (int i = 0; i < size-1; i++) { Node nextNext = next.getNext(); //获取当前下下个元素 next.setNext(temp); temp = next; next = nextNext; } last.setNext(null); first = temp; }
public class LinkReverse { public static void main(String[] args) { Link link = new Link(); link.add(0,1); //1 link.add(1,2); //1->2 link.add(2,3); //1->2->3 link.add(3,4); //1->2->3->4 link.add(4,5); //1->2->3->4->5 link.printLink();//1->2->3->4->5 link.lindRevese(); link.printLink();//5->4->3->2->1 } }
代码部分用到了上篇文章Java数据结构与算法——链表的代码段,请移步获取。指针
码字不易,如对您有帮助,欢迎点赞收藏打赏^_^