链表的使用

注:此博文为本人学习过程中的笔记

1.链表的概念和结构

链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的应用链接次序实现的。

注意:

1.从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续

2.现实中的节点一般都是从堆上申请出来的

3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续 

实际中的链表的结构非常多样,以下情况组合起来就有8种链表结构:

1.单向或者双向

2.带头或者不带头

3.循环或者非循环 

虽然有这么多的链表结构,但是我们需要重点掌握的只有两种:

无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶,图的邻接表等等。

无头双向循环链表:在Java的集合框架库中LinkedList底层实现的就是无头双向循环链表。 

2.LinkedList 

LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在任意位置插入或者删除元素是,不需要搬移元素,效率比较高。 

说明:

1.LinkedList实现了List接口

2.LinkedList的底层使用了双向链表

3.LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问

4.LinkedList的任意位置插入和删除元素是效率比较高,时间复杂度为O(1)

5.LinkedList比较适合任意位置插入的场景 

2.1.LinkedList的使用 

2.1.1.构造方法 

LinkedList()        无参构造

public LinkedList(Collection<? extends E> c)        使用其他集合容器中元素构造List 

2.1.2.常用方法

boolean add(E e)        尾插e

void add(int index, E element)        将e插入到index位置

boolean addAll(Collection<? extends E> c)        尾插c中的元素

E remove(int index)        删除index位置元素

boolean remove(Object o)        删除遇到的第一个o

E get(int index)        获取下标index位置元素

E set(int index, E element)        将下标index位置元素设置为element

void clear()        清空

boolean contains(Object o)        判断o是否在线性表中

int indexOf(Object o)        返回第一个o所在下标

int lastIndexOf(Object o)        返回最后一个o的下标

List<E> subList(int fromIndex, int toIndex)        截取部分list 

2.1.3.遍历 

public static void main(String[] args) {
    LinkedList<Integer> list = new LinkedList<>();
    list.add(1);//add(elem):表示尾插
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);
    list.add(7);
    System.out.println(list.size());
    //foreach遍历
    for(Integer e:list) {
        System.out.prinln(e + " ");
    }
    System.out.println();
    //使用迭代器遍历--正向遍历
    ListIterator<Integer> it = list.listIterator();
    while(it.hasNext()) {
        System.out.print(it.next() + " ");
    }
    System.out.println();
    //使用迭代器遍历--反向遍历
    ListIterator<Integer> rit = list.listIterator(list.size());
    while(rit.hasPrevious) {
        System.out.print(rit.previous + " ");
    }
    System.out.println();
}

3.ArrayList和LinkedList的不同点 

存储空间上,ArrayList物理上一定连续,LinkedList逻辑上连续,但物理上不一定连续

随机访问,ArrayList支持O(1),LinkedList不支持O(N)

头插,ArrayList需要搬移元素,效率低O(N),LinkedList只需修改引用的指向,时间复杂度为O(1)

插入,ArrayList空间不够时需要扩容,LinkedList没有容量的概念

应用场景,ArrayList元素高效储存+频繁访问,LinkedList任意位置插入和删除频繁 

 

 

 

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值