【Java 数据结构】LinkedList 类 和 模拟实现链表

🔥 博客主页🔥 :【 坊钰_CSDN博客

欢迎各位点赞👍 评论**✍收藏⭐**

目录

[1. 什么是 LinkedList ?](#1. 什么是 LinkedList ?)

[2 LinkedList 的使用](#2 LinkedList 的使用)

[2.1 LinkedList 的构造](#2.1 LinkedList 的构造)

[2.2 LinkedList 的常用方法](#2.2 LinkedList 的常用方法)

[2.3 LinkedList 的遍历](#2.3 LinkedList 的遍历)

[3. 单链表的模拟实现](#3. 单链表的模拟实现)

[3.1 基本框架](#3.1 基本框架)

[3.2 头插](#3.2 头插)

[3.3 尾插](#3.3 尾插)

[3.4 在第 pos 位后面插入 val](#3.4 在第 pos 位后面插入 val)

[3.5 打印](#3.5 打印)

[3.6 求大小](#3.6 求大小)

[4. 全部源码](#4. 全部源码)

[5. 小结](#5. 小结)


1. 什么是 LinkedList ?

对于存储数据来说,ArrayList 是有缺陷的,ArrayList 动态扩容时可能会有空间的损失,而 LinkedList 的元素存储在特定的节点中,通过引用来联系元素之间的关系,效率较高

LinkedList 也是实现了 List 接口

  • LinkedList 的底层是使用了双链表
  • LinkedList 适合多次频繁插入和删除的场景

2 LinkedList 的使用

2.1 LinkedList 的构造

LinkedList 有两种构造方法

java 复制代码
LinkedList()                            //空构造方法
LinkedList(Collection<? extends E>)     //以链表进行构造(必须为 E 的子类)
java 复制代码
public class Test {
    public static void main(String[] args) {
        // 空构造
        LinkedList list1 = new LinkedList();

        // 以链表来构造
        LinkedList list2 = new LinkedList(list1);
    }
    
}

2.2 LinkedList 的常用方法

LinkedList 的常用方法 和 ArrayList的常用方法 基本一样,有兴趣可以看一下上一篇博客

【Java 数据结构】ArrayList 类 与 模拟实现顺序表-CSDN博客

2.3 LinkedList 的遍历

java 复制代码
public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        // for-each 遍历
        for(Integer x : list)
            System.out.print(x);

        //使用迭代器遍历
        ListIterator<Integer> it = list.listIterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
    }
}

3. 单链表的模拟实现

3.1 基本框架

java 复制代码
public class MyLinkedList {

    public static class LinkedNode {
        int value;
        LinkedNode next;

        LinkedNode(int value) {
            this.value = value;
        }
    }
}

3.2 头插

java 复制代码
/*
 * 头插
 * */

public void addInsert(int val) {
    LinkedNode node = new LinkedNode(val);
    if (head == null) {
        head = node;
    } else {
        node.next = head;
        head = node;
    }
}

3.3 尾插

java 复制代码
/*
 * 尾插
 * */

public void fastInsert(int val) {
    LinkedNode node = new LinkedNode(val);
    if (head == null) {
        head = node;
    } else {
        LinkedNode ret = head;
        while (ret.next != null) {
            ret = ret.next;
        }
        ret.next = node;
    }
}

3.4 在第 pos 位后面插入 val

java 复制代码
/*
 * 在第 pos 位后面插入 val
 * */

public void posInsert(int pos,int val) {
    LinkedNode node = new LinkedNode(val);
    if (pos <= 0 || pos > linkSize()) {
        System.out.println("Pos is No !");
        return;
    }
    if (pos == linkSize()) {
        fastInsert(val);
        return;
    }
    int count = pos - 1;
    LinkedNode ret = head;
    while (count != 0) {
        ret = ret.next;
        count--;
    }
    node.next = ret.next;
    ret.next = node;

}

3.5 打印

java 复制代码
/*
 * 打印
 * */

public void printList() {
    LinkedNode ret = head;
    while (ret != null) {
        System.out.print(ret.value+" ");
        ret = ret.next;
    }
    System.out.println();
}

3.6 求大小

java 复制代码
/*
 * 求大小
 * */

public int linkSize() {
    int count = 0;
    LinkedNode ret = head;
    while (ret != null) {
        count++;
        ret = ret.next;
    }
    return count;
}

4. 全部源码

java 复制代码
public class MyLinkedList {

    public static class LinkedNode {
        int value;
        LinkedNode next;

        LinkedNode(int value) {
            this.value = value;
        }
    }

    LinkedNode head;

    /*
     * 打印
     * */
    public void printList() {
        LinkedNode ret = head;
        while (ret != null) {
            System.out.print(ret.value+" ");
            ret = ret.next;
        }
        System.out.println();
    }

    /*
     * 求大小
     * */
    public int linkSize() {
        int count = 0;
        LinkedNode ret = head;
        while (ret != null) {
            count++;
            ret = ret.next;
        }
        return count;
    }


    /*
     * 头插
     * */
    public void addInsert(int val) {
        LinkedNode node = new LinkedNode(val);
        if (head == null) {
            head = node;
        } else {
            node.next = head;
            head = node;
        }
    }

    /*
     * 尾插
     * */
    public void fastInsert(int val) {
        LinkedNode node = new LinkedNode(val);
        if (head == null) {
            head = node;
        } else {
            LinkedNode ret = head;
            while (ret.next != null) {
                ret = ret.next;
            }
            ret.next = node;
        }
    }

    /*
     * 在第 pos 位后面插入 val
     * */
    public void posInsert(int pos,int val) {
        LinkedNode node = new LinkedNode(val);
        if (pos <= 0 || pos > linkSize()) {
            System.out.println("Pos is No !");
            return;
        }
        if (pos == linkSize()) {
            fastInsert(val);
            return;
        }
        int count = pos - 1;
        LinkedNode ret = head;
        while (count != 0) {
            ret = ret.next;
            count--;
        }
        node.next = ret.next;
        ret.next = node;

    }
}

5. 小结

以上就是对 ArrayList 类 和 顺序表 的了解,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持

相关推荐
P7进阶路2 小时前
72.是否可以把所有Bean都通过Spring容器来管理?(Spring的applicationContext.xml中配置全局扫 描)
xml·java·spring
每天写点bug2 小时前
【go每日一题】 责任链模式的实现
开发语言·golang·责任链模式
找了一圈尾巴2 小时前
Wend看源码-Java-Map学习
java·学习·map
罗政2 小时前
PDF书籍《手写调用链监控APM系统-Java版》第4章 SPI服务模块化系统
java·pdf·linq
北欧人写代码2 小时前
javaWeb开发
java
犬余2 小时前
设计模式之享元模式:看19路棋盘如何做到一子千面
java·设计模式·享元模式
半盏茶香2 小时前
C语言勘破之路-最终篇 —— 预处理(下)
c语言·开发语言·c++·算法
老马啸西风2 小时前
NLP 中文拼写检测纠正论文 Automatic-Corpus-Generation
java
时雨h2 小时前
30天面试打卡计划 2024-12-25 26 27 面试题
java·开发语言·数据库
别致的影分身3 小时前
Linux 线程池
java·开发语言·jvm