数据结构-java中链表的存储原理及使用方式
创始人
2024-12-27 01:05:20
0

目录

链表(线性表的链式存储)

代码实例:(链表构建,头插+尾插)

LinkedList

LinkedList的使用:

1、构造方法

 2、操作方法

LinkedList 和 ArrayList 的区别


链表(线性表的链式存储)

它可以不断扩容,无固定长度

每一个节点都是由value和next构成

有两种插入的方式:头插法尾插法

代码实例:(链表构建,头插+尾插)

public class Listnode {     public int value;     public Listnode next; //指针     public Listnode(int n) {         this.value=n;     }
public class Linklist {     //定义头指针     Listnode head;      //头插法     public void startAdd(int n) {         Listnode listnode=new Listnode(n);         listnode.next=head;//新节点的next是原来的首节点         head=listnode;//头结点指向新节点实现头插法     }     //尾插法     public void endAdd(int n) {         Listnode listnode=new Listnode(n);         //判断头结点是否为空,空就通过值传递把新节点传给头节点         if(head==null) {             head=listnode;             return;         }         //头结点不是空,则往下遍历,一直找到尾结点,此时temp就指向尾结点         Listnode temp=head;         while(temp.next!=null) {             temp=temp.next;         }         //尾结点的后面插入新节点         temp.next=listnode;     }      //把添加的值打印的方法     public void printLink() {         Listnode temp=head;         while(temp!=null) {             System.out.print(temp.value+"->");             temp=temp.next;         }     } }

测试类:

public class Test {     public static void main(String[] args) {         Linklist linklist=new Linklist();         linklist.endAdd(1);         linklist.endAdd(2);         linklist.startAdd(0);         linklist.startAdd(-1);         linklist.startAdd(-2);         linklist.printLink();     } }

LinkedList

在Java中,LinkedList(链表)是Java提供的一个实现了List接口的类。是基于双向链表结构实现的

LinkedList的使用:

1、构造方法

1、LinkedList():创建一个空的LinkedList对象。

LinkedList list = new LinkedList<>(); 

2、LinkedList(Collection c):创建一个包含指定集合中的元素的LinkedList对象。集合中的元素将按照迭代器返回的顺序添加到LinkedList中。

List collection = new ArrayList<>(); collection.add("Element 1"); collection.add("Element 2"); LinkedList list = new LinkedList<>(collection); 

3、LinkedList(LinkedList c):创建一个包含指定LinkedList中的元素的LinkedList对象。指定LinkedList中的元素将按照迭代器返回的顺序添加到新的LinkedList中。

LinkedList originalList = new LinkedList<>(); originalList.add("Element 1"); originalList.add("Element 2"); LinkedList newList = new LinkedList<>(originalList); 

 2、操作方法

1、添加元素:

  • add(E element):在链表末尾添加一个元素。
  • addFirst(E element):在链表开头添加一个元素。
  • addLast(E element):在链表末尾添加一个元素。
LinkedList list = new LinkedList<>(); list.add("Element 1"); list.addFirst("Element 0"); list.addLast("Element 2"); 

2、获取元素:

  • get(int index):获取指定位置的元素。
  • getFirst():获取链表的第一个元素。
  • getLast():获取链表的最后一个元素。
LinkedList list = new LinkedList<>(); list.add("Element 1"); list.add("Element 2"); String element = list.get(0); String firstElement = list.getFirst(); String lastElement = list.getLast(); 

3、删除元素:

  • remove(int index):删除指定位置的元素。
  • removeFirst():删除链表的第一个元素。
  • removeLast():删除链表的最后一个元素。
LinkedList list = new LinkedList<>(); list.add("Element 1"); list.add("Element 2"); list.remove(0); list.removeFirst(); list.removeLast(); 

4、判断元素是否存在:

  • contains(Object element):检查链表是否包含指定元素。
LinkedList list = new LinkedList<>(); list.add("Element 1"); list.add("Element 2"); boolean containsElement = list.contains("Element 1"); 

5、获取链表大小和清空链表:

  • size():获取链表中元素的个数。
  • isEmpty():检查链表是否为空。
  • clear():清空链表中的所有元素。
LinkedList list = new LinkedList<>(); list.add("Element 1"); list.add("Element 2"); int size = list.size(); boolean isEmpty = list.isEmpty(); list.clear(); 

链表的优点:可以高效地插入和删除节点,而无需移动其他节点。

缺点:访问特定位置的节点需要从头部开始遍历,随机访问的效率较低。

LinkedList 和 ArrayList 的区别

首先说说动态数组ArrayList:

这是一个集合类型,在其内部维护了一个数组,可以自动调整其大小以容纳更多的元素。当你向这些集合中添加元素时,如果内部数组已满,它们会自动创建一个更大的新数组(扩容),并将旧数组的元素以及新元素复制到新数组中。

内部数组初始容量:10

触发扩容的条件:原有数组elementData满了之后就会扩容

扩容方式:新容量=原容量+(原容量>>1)

数组优点:可以随机访问,效率极高;缺点:需要连续的空间,而链表结构可以比较好的利用碎片化空间

LinkedList 和 ArrayList 的区别:

底层数据结构:LinkedList底层基于链表实现,而ArrayList底层基于动态数组实现。

插入和删除操作:由于LinkedList是基于链表的数据结构,插入和删除元素的操作比较高效,时间复杂度为O(1),因为只需要调整节点的指针。而ArrayList的底层是动态数组,插入和删除操作需要移动其他元素,时间复杂度为O(n),其中n是元素的数量。

随机访问:ArrayList支持高效的随机访问,可以通过索引快速获取元素,时间复杂度为O(1)。而LinkedList需要从头开始遍历链表才能找到指定位置的元素,时间复杂度为O(n),其中n是索引位置。

内存消耗:由于LinkedList需要额外的指针来维护节点之间的连接关系,因此在存储相同数量的元素时,LinkedList通常会占用更多的内存空间。而ArrayList只需要连续的内存空间来存储元素。

迭代器性能:对于迭代器遍历操作,LinkedList的性能较好,因为只需要遍历链表中的节点即可。而ArrayList在使用迭代器遍历时,由于底层是数组,可能会导致性能稍差。

相关内容

热门资讯

二刹那秒懂!(松滋麻将)外挂辅... 二刹那秒懂!(松滋麻将)外挂辅助器透视挂!(透视)详细教程(2020已更新)(哔哩哔哩);一、松滋麻...
第3个了解!微扑克小程序外挂透... 第3个了解!微扑克小程序外挂透明挂辅助软件,微扑克ai软件(有挂细节)-哔哩哔哩是一款可以让一直输的...
4分钟了解!(嘟咪互娱)外挂透... 自定义新版嘟咪互娱系统规律,只需要输入自己想要的开挂功能,一键便可以生成出嘟咪互娱专用辅助器,不管你...
第二实锤!来玩app德州软件透... 第二实锤!来玩app德州软件透明挂辅助插件,wepoke小技巧(有挂规律)-哔哩哔哩;1、让任何用户...
8分钟了解!(掌酷天天开心)外... 8分钟了解!(掌酷天天开心)外挂透明挂辅助神器!(透视)详细教程(2024已更新)(哔哩哔哩);1、...
十分钟了解!德普之星外挂透明挂... 十分钟了解!德普之星外挂透明挂辅助器开挂,微扑克规律(有挂秘诀)-哔哩哔哩;微扑克规律是一种具有地方...
9刹那秒懂!(快乐联盟)外挂透... 自定义新版快乐联盟系统规律,只需要输入自己想要的开挂功能,一键便可以生成出快乐联盟专用辅助器,不管你...
第七了解!德州微扑克外挂透明挂... 第七了解!德州微扑克外挂透明挂辅助作弊,wepoke ai代打(有挂教程)-哔哩哔哩是一款可以让一直...
【Python】Linux下载... 1. 从Python官网下载源代码首先,你需要从Python的官方网站(...
5瞬间秒懂!(咪咪扑克)外挂辅... 5瞬间秒懂!(咪咪扑克)外挂辅助器插件!(透视)详细教程(2024已更新)(哔哩哔哩)是一款可以让一...