数据结构-链表

简述

  1. 最简单的动态数据结构

  2. 元素值封装在节点Node中,这也给多元素,多类型的存储提供了条件

  3. 更深入理解引用

  4. 更深入理解递归

        public ListNode removeElements(ListNode head, int val) {
            if (head == null) return null;
            head.next = removeElements(head.next, val);
            return head.val == val ? head.next : head;
        }
    
        public ListNode removeFirstElement(ListNode node, int val) {
            if (node == null) return null;
            if (node.val == val) {
                return node.next;
            }
            node.next = removeFirstElement(node.next, val);
            return node;
        }
    

    递归调用步骤

    以上截图出自慕课网《数据结构精讲》

优缺点

优点

在头尾增删元素很快(实际应用中很少要从中间插入的),复杂度为O(1)

缺点

不适合用于索引有语义的情况

丧失了随机访问的能力

应用

  1. Java集合核心类LinkedList及字典核心类LinkedHashMap

我的实现

扩展实现

相关面试题

  1. 请说一下链表跟数组的区别?

    1. 数组静态分配内存,链表动态分配内存;
    2. 数组在内存中连续,链表不连续;
    3. 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
    4. 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1);此处存疑,参考数组和链表增删操作快慢问题
  2. ArrayListLinkedList的区别

    1. ArrayList是基于动态数组实现的,LinkedList是基于双向链表实现的。

    2. ArrayList支持随机访问(RandomAccess),LinkedList不支持。

    3. ArrayList的查询和尾部插入元素效率较高,中间插入和删除元素效率较低,因为有大量的数组复制操作。 LinkedList的插入和删除效率较高,只需要把节点指针改变一下就行,但是查询效率较低,即使有双向链表的特性可以从两个方向查找,但还是需要使用蛮力法的方式进行遍历,所以效率较低。

    4. ArrayList会造成一定的空间浪费,因为随时需要探测数组容量然后扩容;LinkedList通过节点方式进行存放数据,不存在空间浪费。

  3. 单向链表和双向链表的区别?

    单向链表只能一个方向遍历,双向链表则有前驱,Java中的链表实现就是双向链表,优点是可以使用二分法优化查找,缺点是开辟的空间比单向链表大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值