• 【数据结构】链表和LinkedList的理解和使用


    目录

    1.前言

    2.链表

     2.1链表的概念以及结构

    2.2链表的实现

    3.LinkedList的使用

     3.1什么是LinkedList

    3.2LinkedList的使用 

    2.常用的方法介绍

    4. ArrayList和LinkedList的区别


    1.前言

      在上一篇文章中我们介绍了顺序表,ArrayList的底层原理和具体的使用,但是当我们想进行频繁的插入和删除的时候,这种存储数据的方式,时间复杂度是O(N),这种数据结构并不适合平凡的插入和删除。那么有没有一种数据结构在进行这种操作的时候,时间复杂度为O(1)呢?

     那么本篇文章就给大家介绍一种,适合频繁的插入和删除操作的数据结构—链表,在进行这些操作的时候,它的时间复杂度为O(1).

    2.链表

     2.1链表的概念以及结构

     链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是引用(地址)链接次序实现的

    如上图的火车一样,每一节车厢代表链表的一个节点,它们链接在一起组成了火车,也就是我们的链表。

      实现链表的结构非常多样,可以是双向或者单向,也可以带头或者不带头,还有循环和非循环。

    我们着重学习和了解单向无头不循环链表

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

    2.2链表的实现

     接下来我来给大家自定义一个链表的实现:其中有对链表的增删改查

    1. public class MyLinkedList {
    2. // 1、无头单向非循环链表实现
    3. class Node{
    4. private int val;
    5. private Node next;
    6. public Node(int val) {
    7. this.val = val;
    8. }
    9. }
    10. public Node head;
    11. //头插法
    12. public void addFirst(int data){
    13. Node node=new Node(data);
    14. if(head==null){
    15. head=node;
    16. }else {
    17. node.next=head;
    18. head=node;
    19. }
    20. } //尾插法
    21. public void addLast(int data){
    22. Node node=new Node(data);
    23. if(head==null) {
    24. head = node;
    25. }else {
    26. Node cur=head;
    27. while (cur.next!=null){
    28. cur=cur.next;
    29. }
    30. cur.next=node;
    31. }
    32. } //任意位置插入,第一个数据节点为0号下标
    33. public void addIndex(int index,int data){
    34. Node node=new Node(data);
    35. if(index == 0){
    36. node.next=head;
    37. head=node;
    38. return;
    39. }
    40. int count=index-1;
    41. Node cur=head;
    42. while (count!=0){
    43. cur=cur.next;
    44. count --;
    45. }
    46. node.next=cur.next;
    47. cur.next=node;
    48. } //查找是否包含关键字key是否在单链表当中
    49. public boolean contains(int key){
    50. Node cur=head;
    51. while (cur != null){
    52. if(cur.val == key){
    53. return true;
    54. }
    55. cur=cur.next;
    56. }
    57. return false;
    58. } //删除第一次出现关键字为key的节点
    59. public void remove(int key){
    60. Node cur=this.head;
    61. if(cur.val == key){
    62. head=cur.next;
    63. }
    64. while (cur.next!=null){
    65. if(cur.next.val == key){
    66. cur.next=cur.next.next;
    67. return;
    68. }
    69. else {
    70. cur=cur.next;
    71. }
    72. }
    73. }
    74. //删除所有值为key的节点
    75. public void removeAllKey(int key){
    76. Node cur=this.head;
    77. if(cur.val == key){
    78. head=cur.next;
    79. }
    80. while (cur.next!=null){
    81. if(cur.next.val == key){
    82. cur.next=cur.next.next;
    83. }
    84. else {
    85. cur=cur.next;
    86. }
    87. }
    88. }
    89. public void display(){
    90. Node cur=head;
    91. while (cur!=null){
    92. System.out.print(cur.val +" ");
    93. cur=cur.next;
    94. }
    95. }
    96. }

    3.LinkedList的使用

     3.1什么是LinkedList

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

    在集合框架中,LinkedList也实现了List接口,具体如下:

    【说明】
    1. LinkedList实现了List接口
    2. LinkedList的底层使用了双向链表
    3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
    4. LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
    5. LinkedList比较适合任意位置插入的场景

    3.2LinkedList的使用 

    1.构造

    方法解释
    LinkedList()无参构造
    public LinkedList(Collection c)使用其他集合容器中元素构造List

    2.常用的方法介绍

    方法解释
    boolean add(E e)尾插 e
    void add(int index, E element)将 e 插入到 index 位置
    boolean addAll(Collection 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 subList(int fromIndex, int toIndex)截取部分 list

    4. ArrayList和LinkedList的区别

    不同点ArrayListLinkedList
    存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
    随机访问支持O(1)不支持:O(N)
    头插需要搬移元素,效率低O(N)只需修改引用的指向,时间复杂度为O(1)
    插入空间不够时需要扩容没有容量的概念
    应用场景元素高效存储+频繁访问任意位置插入和删除频繁

  • 相关阅读:
    【MySQL】索引
    MMKV(1)
    算法训练营day48,动态规划16
    Mac 打开 MySQL
    项目实战——匹配系统(中)
    Set cancelled by MemoryScratchSinkOperator
    《安富莱嵌入式周报》第270期:2022.06.13--2022.06.19
    基于java+SpringBoot+VUE+Mysql+微信小程序物业管理系统
    【无标题】
    推荐系统笔记(十一):使用coo_matrix函数遇到的坑
  • 原文地址:https://blog.csdn.net/weixin_64173948/article/details/133240825