Java:数据结构-LinkedList和链表(2)

news2024/10/26 9:33:41

一 LinkedList

LinkedList的方法的实现

1.头插法

public class MyLinkedList implements IList{
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

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

    }
    public ListNode head;
    public ListNode last;

    @Override
    public void addFirst(int data) {
        ListNode node=new ListNode(data);
        ListNode cur=head;
        if (head==null) {
            head = last = cur;
        } else{
            node.next=head;
            head.prev=node;
            head=node;
        }
    }
}

2.尾插法

public class MyLinkedList implements IList{
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

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

    }
    public ListNode head;
    public ListNode last;
    public void addLast(int data) {
        ListNode node=new ListNode(data);
        ListNode cur=head;
        if (head==null) {
            head = last = cur;
        } else{
            node.prev=last;
            last.next=node;
            last=node;
        }
    }
}

3.任意位置插入,第一个数据节点为0号下标

public class MyLinkedList implements IList{
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

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

    }
public void addIndex(int index, int data) {
        ListNode node=new ListNode(data);
        int len=size();
        if(index<0 || index>len){
            return;
        }
        if(index==0){
            addFirst(data);
        }
        if(index==len){
            addLast(data);
        }
        ListNode cur=head;
        node.next=cur;
        node.prev=cur.prev;
        cur.prev.next=node;
        cur.prev=node;
    }

4.查找是否包含关键字key是否在链表当中

public class MyLinkedList implements IList{
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

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

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

5.得到链表的长度

public class MyLinkedList implements IList{
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

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

    }
    public ListNode head;
    public ListNode last;

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

6.打印链表 

public class MyLinkedList implements IList{
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

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

    }
    public ListNode head;
    public ListNode last;

public void display() {
        ListNode cur=head;
        while (head!=null){
            System.out.println(head.val+" ");
            head=head.next;
        }
    }

7.删除第一次出现关键字为key的节点

删除中间部分

删除头

并且考虑只有一项的情况下

删除尾

 

public class MyLinkedList implements IList{
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

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

    }
    public ListNode head;
    public ListNode last;


public void remove(int key) {
        ListNode cur=head;
        while (cur!=null){
            if(cur.val==key){
                if(cur==head){
                    head=head.next;
                    if(head!=null) {
                        head.prev=null;
                    }

                }else {
                    if(cur.next==null){
                        cur.prev.next=null;
                        last=last.prev;
                    }else {
                        cur.prev.next=cur.next;
                        cur.next.prev=cur.prev;
                    }
                }
                return;
            }
                cur=cur.next;
        }

    }
}

8.删除所有值为key的节点

跟remove基本一样,删去return就行了,将整个链表检查一遍,删去全部的key

public void removeAllKey(int key) {
        ListNode cur=head;
        while (cur!=null){
            if(cur.val==key){
                if(cur==head){
                    if(head!=null) {
                        cur.next.prev = null;
                    }

                }else {
                    if(cur.next==null){
                        cur.prev.next=null;
                        last=last.prev;
                    }else {
                        cur.prev.next=cur.next;
                        cur.next.prev=cur.prev;
                    }
                }
            }
            cur=cur.next;
        }
    }

9.清空链表

 

public class MyLinkedList implements IList{
    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode prev;

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

    }
    public ListNode head;
    public ListNode last;

public void clear() {
        ListNode cur=head;
        while (cur!=null){
            ListNode curN=cur.next;
            cur.prev=null;
            cur.next=null;
            cur=curN;
        }
    }
}

 

LinkedList方法的使用

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList=new LinkedList<>();
        List<Integer> list=new LinkedList();
        linkedList.add(1);
        linkedList.addFirst(3);
        linkedList.addLast(6);
        ArrayList<Integer> list1=new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        linkedList.addAll(list1);
        System.out.println(linkedList);
        linkedList.remove(2);
        linkedList.get(3);
        linkedList.set(2,6);
        linkedList.contains(5);
        linkedList.size();
        linkedList.clear();
    }

LinkedList的遍历

1.for循环遍历

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList=new LinkedList<>();
        linkedList.add(1);
        linkedList.addFirst(3);
        linkedList.addLast(6);
        for (int i = 0; i < linkedList.size(); i++) {
            System.out.println(linkedList.get(i)+" ");
        }
    }

2.foreach遍历

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList=new LinkedList<>();
        linkedList.add(1);
        linkedList.addFirst(3);
        linkedList.addLast(6);
for (Integer x:linkedList) {
            System.out.print(x+" ");
        }
    }
}

3.迭代器

Iterator

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList=new LinkedList<>();
        linkedList.add(1);
        linkedList.addFirst(3);
        linkedList.addLast(6);
        Iterator<Integer> iterator=linkedList.iterator();
        while (iterator.hasNext()){
            System.out.print(iterator.next());
        }

 ListIterator

1.按顺序打印
public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList=new LinkedList<>();
        linkedList.add(1);
        linkedList.addFirst(3);
        linkedList.addLast(6);
        ListIterator<Integer> it=linkedList.listIterator();
        while (it.hasNext()){
            System.out.println(it.next()+" ");
        }
2.逆序打印
public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList=new LinkedList<>();
        linkedList.add(1);
        linkedList.addFirst(3);
        linkedList.addLast(6);
        ListIterator<Integer> it1=linkedList.listIterator();
        while (it1.hasPrevious()){
            System.out.println(it1.previous()+" ");
        }
}

注: ListIterator可以当作迭代器的原因是,它是Iterator的子类,专门用来打印List类的。

ArrayList和LinkedList的区别 

当你进行查找时,我建议你选择ArrayList,因为LinkedList访问任意元素需要从头或尾遍历链表,时间复杂度为 O(n),ArrayList可以通过索引直接访问任意元素,时间复杂度是 O(1)。

当我们经常使用插入等功能,可以使用LinkedList,如果在末尾插入或删除元素,效率较高(时间复杂度 O(1)),ArrayList需要移动大量元素,因此效率较低(时间复杂度 O(n))。

希望能对大家有所帮助!!!!

 

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

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

相关文章

基于stm32的HAL库的串口实现不定长数据收发(三)(接收中断)

串口实现不定长数据收发&#xff08;接收中断&#xff09; 1头文件 #include "uart1.h" #include "string.h" #include "stdio.h" #include "sys.h"#define UART1_RX_BUF_SIZE 128 //接收 #define UART1_TX_BUF_SIZE 64 //发送 发送…

量化选股:原理与实战指南(一)

🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之量化交易》🍎本文内容:量化选股:原理与实战指南(一)🌸作者“三要”格言:要坚强、要努力、要学习 目录 引言 一、量化选股的基本概…

docker入门(二)之容器命令及私有仓库的部署(本地和harbor)

容器命令&#xff1a; 1.启动容器 接下来演示在docker下运行一个ubuntu系统&#xff0c;从中学习各容器命令。 --name"容器新名字" 为容器指定一个名称(不指定的话会随机分配一个名字)。 -d: 后台运行容器并返回容器ID&#xff0c;也就启动守护式容器(后台运行) -…

【Golang】关于Go语言中的定时器原理与实战应用

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【计算机网络 - 基础问题】每日 3 题(三十八)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

ROS2 “通信方式” 参数服务器

为什么加“通信方式”引号&#xff0c;因为我觉得他就不算通信&#xff0c;最多最多就是一个动态加载参数方式 所以ros通信方式就三种&#xff0c;topic service action 别犟&#xff0c;犟就是你对&#xff01; 常用的 param参数方法如下&#xff1a; # declare_parameter…

基于Java的旅游网站管理系统—计算机毕业设计源码39235

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对旅游网站等问题&#xff0c;对旅游网站进行…

项目计划书,项目经理日常文档,项目管理计划,项目总体实施计划,总体测试计划,总体运维计划,总体开发计划(word原件获取)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件资料清单列表部分文档&#xff1a; 工作安排任务书…

Shuffle Net系列详解 (4) Shuffle Net V2实践部分讲解 for pytorch版本

Shuffle Net 系列 实践部分1.文件划分2.Block(差异文件)3.Network(差异文件)3.总结 实践部分 在看代码之前先叠加一个甲&#xff0c;本文并未跑出来这个实验结果。实验条件有限&#xff0c;论文中采用的ImageNet dataset 数据集有些太大了。后续会出一个简化版本的代码进行实践…

探索Spring Cloud Config:构建高可用的配置中心

目录 认识Spring Cloud ConfigConfig Server读取配置文件步骤1&#xff1a;&#xff08;1&#xff09;创建config-server项目&#xff08;2&#xff09;在config-server中开启Config Server功能&#xff08;3&#xff09;在config-server配置文件进行相关配置&#xff08;4&…

深入理解 Transformer:构建先进 NLP 模型的关键技术

目录 一、Transformer 为何如此重要&#xff1f;二、Transformer 的核心组成部分1. 注意力机制2. 位置编码3. 前馈神经网络 三、Transformer 的训练方法1. 无监督预训练2. 有监督微调 四、Transformer 的应用场景五、总结与展望 在自然语言处理&#xff08;NLP&#xff09;的领…

【JAVA-数据结构】二叉树

这篇是二叉树相关内容。 1. 树型结构 1.1 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。朝把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶下的。它具有以…

外卖点餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;外卖员管理&#xff0c;餐厅管理&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;外卖订单管理&#xff0c;订单配送管理 微信端账号功能包括&#xff1a;系统首页…

Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统 (源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着电子商…

人、机不同的学习机理

在人机协同的过程中&#xff0c;断点&#xff08;或称为障碍点&#xff09;是指可能导致人机合作效率下降、决策失误或任务失败的关键环节。以下是一些常见的断点及其影响&#xff1a;人类和机器之间的信息传递不畅&#xff0c;可能导致误解或遗漏关键信息&#xff0c;技术术语…

YOLO11改进|注意力机制篇|引入三重注意力机制Triplet Attention

目录 一、【Triplet Attention】注意力机制1.1【Triplet Attention】注意力介绍1.2【Triplet Attention】核心代码 二、添加【Triplet Attention】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【Triplet Attention】注意力机…

ARM嵌入式学习--第二天

-指令流水线 -基础知识 1.流水线技术通过多个功能部件并行工作来缩短程序执行时间&#xff0c;提高处理器的效率和吞吐率 2.增加流水线级数&#xff0c;可以简化流水线的各级逻辑&#xff0c;进一步提高了处理器的性能 3.以三级流水线分析&#xff1a; pc代表程序计数器&#x…

Graph Contrastive Learning 图对比学习GCL

Preamble GCL主要任务&#xff1a;学习一个编码器&#xff0c;可以编码出结构和结点特征信息&#xff0c;得到一个低维的表达 早期大部分GNN模型都是有监督的训练 自监督学习主要分成两种&#xff1a;生成式&#xff08;用已有信息去预测自己的其他信息&#xff09; and 对…

C++学习笔记----9、发现继承的技巧(一)---- 使用继承构建类(1)

在前面的章节中&#xff0c;你学到了继承关系是一种真实世界对象以层次存在的模式。在编程世界中&#xff0c;当需要写一个类基于其构建&#xff0c;或进行细微的修改的另一个类时&#xff0c;那种模式就有了关系。完成这个目标的一个方式是拷贝一个类的代码粘贴到另一个类中。…

一个月学会Java 第14天 内部类

Day14 内部类 类有外边的public class&#xff0c;然后还有一个文件多个的class&#xff0c;但是有没有想过&#xff0c;class可以作为成员也就是类内部的类&#xff0c;甚至作为方法内部的属性也就是类内部的方法的内部出现。除了这两个&#xff0c; 还有直接对着上节课讲的抽…