【单链表的模拟实现Java】

news2024/11/22 22:22:16

【单链表的模拟实现Java】

  • 1. 了解单链表的功能
  • 2. 模拟实现单链表的功能
    • 2.1 单链表的创建
    • 2.2 链表的头插
    • 2.3 链表的尾插
    • 2.3 链表的长度
    • 2.4 链表的打印
    • 2.5 在指定位置插入
    • 2.6 查找
    • 2.7 删除第一个出现的节点
    • 2.8 删除出现的所有节点
    • 2.9 清空链表
  • 3. 正确使用模拟单链表

1. 了解单链表的功能

下面为链表的一些基本功能,该文章也将详细讲解下列方法的模拟实现。
在这里插入图片描述

2. 模拟实现单链表的功能

2.1 单链表的创建

在这里插入图片描述

首先要先完成链表这一对象的创建,然后类中包含有:链表中节点这一对象、相关功能的方法(由于后续还要实现双向链表的相关方法,所以这里使用接口)

下面是代码实现

IList接口

public interface IList {

        //头插法
        public void addFirst(int data);
        //尾插法
        public void addLast(int data);
        //任意位置插入,第一个数据节点为0号下标
        public void addIndex(int index,int data);
        //查找是否包含关键字key是否在单链表当中
        public boolean contains(int key);
        //删除第一次出现关键字为key的节点
        public void remove(int key);
        //删除所有值为key的节点
        public void removeAllKey(int key);
        //得到单链表的长度
        public int size();
        public void clear();
        public void display();

}

Mylinkedlist链表

public class Mylinkedlist  implements IList{

    //创建一个对象——链表中的节点
    static class listnode{
        public int val;//节点中储存的数值
        public listnode next;//下一节点的地址

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

    public listnode head;//指向第一个节点的指针

    @Override
    public void addFirst(int data) {

    }

    @Override
    public void addLast(int data) {

    }

    @Override
    public void addIndex(int index, int data) {

    }

    @Override
    public boolean contains(int key) {
        return false;
    }

    @Override
    public void remove(int key) {

    }

    @Override
    public void removeAllKey(int key) {

    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public void clear() {

    }

    @Override
    public void display() {

    }
}


2.2 链表的头插

public void addFirst(int data) {
        listnode p=new listnode(data);
        p.next=head;
        head=p;
    }

2.3 链表的尾插

链表的尾插分两种情况

  • 链表为空,head没有next
  • 链表不为空

首先我们先判断链表是否为空

   public boolean isempty(){
        if(head==null){
            return true;
        }else{
            return false;
        }
    }

之后实现尾插

public void addLast(int data) {

        listnode p=new listnode(data);
        if(isempty()){
            head=p;
        }else{
            //遍历找到最后节点
            listnode pcur=head;
            while(pcur.next!=null){
                pcur=pcur.next;
            }
            //最后节点的指针指向p
            pcur.next=p;
        }

    }

2.3 链表的长度

    public int size() {
        listnode pcur=head;
        int count=0;
        while(pcur!=null){
            pcur=pcur.next;
            count++;
        }
        return count;
    }

2.4 链表的打印

 public void display() {
        listnode pcur=head;
        while(pcur!=null){
            System.out.print(pcur.val+" ");
            pcur=pcur.next;
        }
    }

2.5 在指定位置插入

在指定位置插入分三种情况

  • 该指定位置超出链表的长度,出现异常
  • 该位置为链表头部或尾部,直接使用头插和尾插
  • 正常情况

下面是代码实现

    public void addIndex(int index, int data) {

        if(index>size()||index<0){
            System.out.println("输入异常");
            return;
        }
        if(index==0) addFirst(data);
        else if (index==size()) addLast(data);
        else{
            listnode p=new listnode(data);
            listnode pcur=head;
            //找到指定位置前一个位置
            for(int i=0;i<index-1;i++){
                pcur=pcur.next;
            }
            p.next=pcur.next;
            pcur.next=p;
        }

    }

2.6 查找

    public boolean contains(int key) {
        listnode pcur=head;
        while(pcur!=null){
            if(pcur.val==key){
                return true;
            }
            pcur= pcur.next;
        }
        return false;
    }

2.7 删除第一个出现的节点

删除主要讨论两种情况

  • 删除节点为第一个节点
  • 删除节点为中间节点或尾节点
    public void remove(int key) {
        listnode pcur=head;
        if(pcur==null) return;
        //第一个节点
        if(pcur.val==key){
            pcur=pcur.next;
            head=pcur;
            return;
        }
        //中间节点或尾节点
        while(pcur!=null){
             if(pcur.next!=null&&pcur.next.val==key){
                pcur.next=pcur.next.next;
                return;

            }else{
                pcur= pcur.next;
            }
        }
    }

2.8 删除出现的所有节点

删除出现的所有节点与删除出现的第一个节点有很多相似的地方,代码需要更改的有两点

  • 第一个节点的情况,将if语句改为while语句
  • 中间节点或尾节点,删除后不返回,继续循环,知道遍历完整个链表
    public void removeAllKey(int key) {
        listnode pcur=head;
        if(pcur==null) return;
        //第一个节点
        while(pcur.val==key){
            pcur=pcur.next;
            head=pcur;
        }
        while(pcur!=null){
            if(pcur.next!=null&&pcur.next.val==key){
                pcur.next=pcur.next.next;

            }else{
                pcur= pcur.next;
            }
        }
    }

2.9 清空链表

  public void clear() {
        //遍历逐一释放
        while(head!=null){
            listnode pcur=head;
            head=head.next;
            pcur=null;
        }
    }

3. 正确使用模拟单链表

到这里上面的基础功能已经全部实现,现在就开始使用一下。

main方法如下所示

 public static void main(String[] args) {
        Mylinkedlist l=new Mylinkedlist();

        //头插
        l.addFirst(1);
        l.addFirst(1);
        l.addFirst(1);
        l.addFirst(2);
        //尾插
        l.addLast(3);
        l.addLast(3);
        l.addLast(3);
        l.addLast(4);
        //指定位置插入
        l.addIndex(4,5);
        l.addIndex(6,5);

        System.out.print("原链表:");
        l.display();

        //删除第一次出现的5
        l.remove(5);
        System.out.print("删除第一次出现的5: ");
        l.display();
        //删除所有出现的3
        l.removeAllKey(3);
        System.out.print("删除所有出现的3: ");
        l.display();

        //清空链表
        l.clear();
        System.out.print("清空链表:");
        l.display();
    }

结果:
在这里插入图片描述
该文章到这里就结束了,希望对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重头开始嵌入式第四十八天(Linux内核驱动 linux启动流程)

目录 什么是操作系统&#xff1f; 一、管理硬件资源 二、提供用户接口 三、管理软件资源 什么是操作系统内核&#xff1f; 一、主要功能 1. 进程管理&#xff1a; 2. 内存管理&#xff1a; 3. 设备管理&#xff1a; 4. 文件系统管理&#xff1a; 二、特点 什么是驱动…

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址&#xff1a;GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了&#xff0c;可以参考其他…

yq 工具

文章目录 yq命令快速 Recipes查找数组中的项目查找并更新数组中的项目深度修剪一棵树对数组中的项目进行多次或复杂的更新按字段对数组进行排序 OperatorsOmitOmit keys from mapOmit indices from array DeleteDelete entry in mapDelete nested entry in mapDelete entry in …

【重学 MySQL】六十三、唯一约束的使用

【重学 MySQL】六十三、唯一约束的使用 创建表时定义唯一约束示例 在已存在的表上添加唯一约束示例 删除唯一约束示例 复合唯一约束案例背景创建表并添加复合唯一约束插入数据测试总结 特点注意事项 在 MySQL 中&#xff0c;唯一约束&#xff08;UNIQUE Constraint&#xff09;…

butterfly主题留言板 报错记录 未解决

新建留言板&#xff0c;在博客根目录执行下面的命令 hexo new page messageboard 在博客/source/messageboard的文件夹下找到index.md文件并修改 --- title: 留言板 date: 2018-01-05 00:00:00 type: messageboard ---找到butterfly主题下的_config.yml文件 把留言板的注释…

基于springboot+小程序的智慧物流管理系统(物流1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于springboot小程序的智慧物流管理系统实现了管理员、司机及用户。 1、管理员实现了司机管理、用户管理、车辆管理、商品管理、物流信息管理、基础数据管理、论坛管理、公告信息管理等。…

帮助自闭症孩子融入社会,寄宿学校是明智选择

在广州这座充满活力与温情的城市&#xff0c;有一群特殊的孩子&#xff0c;他们被称为“星星的孩子”——自闭症儿童。自闭症&#xff0c;这个让人既陌生又熟悉的名词&#xff0c;背后承载的是无数家庭的辛酸与希望。对于自闭症儿童来说&#xff0c;融入社会、与人交流、理解世…

【Linux第一弹】- 基本指令

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

blender 记一下lattice

这个工具能够辅助你捏形状 这里演示如何操作BOX shift A分别创建俩对象一个BOX 一个就是lattice对象 然后在BOX的修改器内 创建一个叫做lattice的修改器 然后指定object为刚刚创建的lattice对象 这样就算绑定好了 接下来 进入lattice的编辑模式下 你选取一个点进行运动&#…

量化交易与基础投资工具介绍

&#x1f31f;作者简介&#xff1a;热爱数据分析&#xff0c;学习Python、Stata、SPSS等统计语言的小高同学~&#x1f34a;个人主页&#xff1a;小高要坚强的博客&#x1f353;当前专栏&#xff1a;Python之机器学习《Python之量化交易》Python之机器学习&#x1f34e;本文内容…

谈谈留学生毕业论文如何分析问卷采访数据

留学生毕业论文在设计好采访问题并且顺利进行了采访之后&#xff0c;我们便需要将得到的采访答案进行必要的分析&#xff0c;从而得出一些结论。我们可以通过这些结论回答研究问题&#xff0c;或者提出进一步的思考等等。那么我们应当如何分析采访数据呢&#xff1f;以下有若干…

python3开头如何设置utf-8

编码格式1&#xff1a; 在源文件第一行或者第二行定义&#xff1a; # coding<encoding name> 例如&#xff1a; # codingutf-8 编码格式2&#xff1a;&#xff08;这种最流行&#xff09; 格式如下&#xff1a; #!/usr/bin/python # -*- coding: <encoding name>…

信息安全工程师(43)入侵检测概述

一、定义与目的 入侵检测&#xff08;Intrusion Detection&#xff09;是指通过对行为、安全日志、审计数据或其他网络上可以获得的信息进行操作&#xff0c;检测到对系统的闯入或闯入的企图。其主要目的是确保网络安全和信息安全&#xff0c;保护个人和机构的敏感数据免受未经…

论文阅读:Split-Aperture 2-in-1 Computational Cameras (二)

Split-Aperture 2-in-1 Computational Cameras (一) Coded Optics for High Dynamic Range Imaging 接下来&#xff0c;文章介绍了二合一相机在几种场景下的应用&#xff0c;首先是高动态范围成像&#xff0c;现有的快照高动态范围&#xff08;HDR&#xff09;成像工作已经证…

FreeRTOS——任务创建(静态、动态创建)、任务删除以及内部实现剖析

任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数 API函数描述xTaskCreate()动态方式创建任务xTaskCreateStatic()静态方式创建任务vTaskDelete()删除任务 动态创建任务&#xff1a;任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均有FreeR…

考研代码题:10.10 汉诺塔 爬楼梯 取球 猴子吃桃

汉诺塔 C语言 - 汉诺塔详解&#xff08;最简单的方法&#xff0c;进来看看就懂&#xff09;_汉诺塔c语言程序详解-CSDN博客 #include <stdio.h>void move(char begin,char end){printf("%c->%c\n",begin,end); } //begin开始杆&#xff0c;help辅助杆&am…

BUU刷题-Pwn-axb_2019_mips(MIPS跳转bss段执行shellcode)

解题所涉知识点&#xff1a; 泄露或修改内存数据&#xff1a; 堆地址&#xff1a;栈地址&#xff1a;libc地址&#xff1a;BSS段地址&#xff1a; 劫持程序执行流程&#xff1a;MIPS_ROP 获得shell或flag&#xff1a;[[MIPS_Shellcode]] && [[MIPS劫持RA寄存器]] 题…

开源文件管理工具File Browser本地部署并一键发布公网远程传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…

波轮洗衣机、滚筒洗衣机的清理方法

洗衣机主要分为波轮式、滚筒式这2种&#xff0c;波轮式是水平旋转的&#xff0c;滚筒式是竖直旋转的。波轮式洗衣机一般比较小&#xff0c;用于2至3个人的衣服清理&#xff1b;而滚筒式洗衣机则比较大&#xff0c;用于5至6人的衣服清理。 图(1) 波轮洗衣机 图(2) 滚筒洗衣机 不…

龋齿牙齿病变图像分割系统源码&数据集分享

龋齿牙齿病变图像分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DCNV3&#xff06;yolov8-seg-RepHGNetV2等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glo…