LinkedList模拟实现

1.链表的头插

2.链表的尾插

3.在链表中任意位置前插入

4.查找链表中是否有某一个值val

5.删除第一次出现的值key

6.删除所有出现的值key

在实现链表的功能前,我们首先要明白链表是由每一个结点构成的,每一个结点其实就是一个类,是由val值域和next域构成的,所以我们要先构造一个结点类,即静态内部类

java 复制代码
public LinkedList {
        //创建结点
    static class ListNode{
        //每个结点都有val值域和next结点域组成
        public int val;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }
    
}

让后我们手动创建一个链表,然后让每一个结点next指向下一个结点的

1.链表的头插

在进行头插的时候,我们需要判断这个链表是否为空,如果链表为空的话,那么链表的head就是要插入的新结点,这个需要我们注意

java 复制代码
    public void addFirst(int val) {
        //申请新的结点
        ListNode newNode = new ListNode(val);

        //判断链表是否为空,如果链表为空,那么要插入的结点就是head
        if(head == null) {
            head = newNode;
            return;
        }

        //否则就进行头插
        newNode.next = head;
        head = newNode;
    }

2.链表的尾插

链表的尾插,只需要判断这个链表是否为空,如果为空,那么就相当于头插,如果不为空,那么就只需要我们找到链表的最后一个结点即可

java 复制代码
    public void addLast(int val) {
        ListNode newNode = new ListNode(val);
        if(head == null) {
            head = newNode;
            return;
        }

        //如果链表不为空,那么就要找到最后一个结点
        //定义cur去查找最后一个结点,不要用head去找,不然找完后head就不指向第一个结点了
        ListNode cur = head;
        while(cur.next != null) {
            cur = cur.next;
        }

        cur.next = newNode;
    }

3.在链表中任意位置前插入

在任意位置插入的时候,如果插入的位置为0或者为size,那么就是头插或者尾插,插入前要判断插入的位置是否合法,如果插入的位置<0或者>size,那么插入失败,否则就要找到插入的结点的前一个结点

java 复制代码
 public void addIndext(int pos, int val) {
        ListNode newNode = new ListNode(val);
        if(pos < 0 || pos > size()) {
            System.out.println("插入位置非法!!!,程序退出");
            return;
        }

        if(pos == 0) {
            //头插
            addFirst(val);
            return;
        } else if(pos == size()) {
            //尾插
            addLast(val);
            return;
        }

        //找到要插入的结点的前一个结点
        ListNode cur = head;
        for(int i = 1; i < pos; i++) {
            cur = cur.next;
        }

        //出了循环,cur就在要插入的结点的前面
        newNode.next = cur.next;
        cur.next = newNode;
    }

4.查找链表中是否有某一个值val

java 复制代码
    public boolean contains(int key) {
        ListNode cur = head;
        while(cur != null) {
            if(cur.val == key) {
                System.out.println("查找成功");
                return true;
            }

            cur = cur.next;
        }
        System.out.println("查找失败");
        return false;
    }

5.删除第一次出现的值key

首先先判断链表是否为空,如果不为空,则先判断头结点是不是就是val,如果是,那么让头结点向后走即可,如果不是,那么遍历一次链表看是否能找到,如果找不到则说明这个链表没有这个val值

java 复制代码
    public void remove(int key) {

        ListNode cur = head;
        //判断链表是否为空
        if(head == null) {
            System.out.println("链表为空,无此关键字");
            return;
        }

        if(cur.val == key) {
            head = head.next;
            return;
        }

        while(cur.next != null) {
            if(cur.next.val == key) {
                cur.next = cur.next.next;
                System.out.println("删除成功");
                return;
            }
            cur = cur.next;
        }

        System.out.println("此链表无此关键字key->" + key);

    }

6.删除所有出现的值key

java 复制代码
public void removeAllKey(int key) {

        ListNode cur = head.next;
        ListNode prev = head;
        if(cur == null) {
            System.out.println("链表为空,程序退出");
            return;
        }

        while(cur != null) {
            if(cur.val == key) {
                prev.next = cur.next;
                cur = cur.next;
            }else {
                prev = prev.next;
                cur = cur.next;
            }
        }

        //最后判断一下头结点是否为val值
        if(head.val == key) {
            head = head.next;
        }
    }

总结:

在创建链表的时候,我们要清楚链表是由一个个结点构成的,而每一个结点都是由val域和next域构成,所以我们可以将结点看成一个类,然后在模拟实现方法的时候,我们都要先判断这个链表是否为空,而顺序表是判断是否为满。

相关推荐
好奇龙猫5 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
Boilermaker19925 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
saoys5 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
Cherry的跨界思维5 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS5 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
独自破碎E6 小时前
【二分法】寻找峰值
算法
꧁Q༒ོγ꧂6 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs6 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_996 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子6 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java