数据结构-java中链表的存储原理及使用方式

avatar
作者
筋斗云
阅读量: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<String> list = new LinkedList<>(); 

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

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

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

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

 2、操作方法

1、添加元素:

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

2、获取元素:

  • get(int index):获取指定位置的元素。
  • getFirst():获取链表的第一个元素。
  • getLast():获取链表的最后一个元素。
LinkedList<String> 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<String> list = new LinkedList<>(); list.add("Element 1"); list.add("Element 2"); list.remove(0); list.removeFirst(); list.removeLast(); 

4、判断元素是否存在:

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

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

  • size():获取链表中元素的个数。
  • isEmpty():检查链表是否为空。
  • clear():清空链表中的所有元素。
LinkedList<String> 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在使用迭代器遍历时,由于底层是数组,可能会导致性能稍差。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!