LinkedList概念+MyLinkedList的实现

文章目录

  • LinkedList笔记
    • 一、 LinkedList
      • 1.概念
      • 2.LinkedList的构造方法
      • 3.LinkedList的遍历
    • 二、MyLinkedList的实现
      • 1.定义内部类
      • 2.打印链表、求链表长度、判断是否包含关键字
      • 3. 头插法和尾插法
      • 4.在任意位置插入
      • 5.删除结点
      • 6.清空链表


LinkedList笔记


一、 LinkedList

1.概念

LinkedList的底层是一个双向链表
在这里插入图片描述

  • 在插入和删除时,不用挪动元素
  • 在获取尾部结点时,不需要遍历获取,直接利用last结点

2.LinkedList的构造方法

  • 分为无参构造和有参构造
    在这里插入图片描述

有参:使用其他集合容器中元素构造List
在构造LinkedList的时候,传递的参数的类型要满足指定泛型的上界,同时要实现Collection接口

3.LinkedList的遍历

分别用重写的print方法、foreach、迭代器进行遍历

 public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("hello");linkedList.add("world");linkedList.add("!");linkedList.add("?");linkedList.add("|");System.out.println(linkedList);System.out.println("-----------");for (String x:linkedList) {System.out.print(x+" ");}System.out.println();System.out.println("-----------");//使用迭代器遍历-正向遍历ListIterator<String> it = linkedList.listIterator();while (it.hasNext()){System.out.print(it.next()+" ");}System.out.println();System.out.println("===========");ListIterator<String> rit = linkedList.listIterator(linkedList.size());while (rit.hasPrevious()){System.out.print(rit.previous()+" ");}//使用迭代器遍历-反向遍历}

二、MyLinkedList的实现

1.定义内部类

与单链表不同的是,双链表的结点新增了prev域

public class MyLinkedList {static class ListNode{public int val;public ListNode prev;//前驱public ListNode next;//后继public ListNode(int val) {//构造方法this.val = val;}}public ListNode head;//定义头结点public ListNode last;//定义尾结点

1.在内部类中定义结点的元素
2.定义构造器
3.创建头/尾结点

2.打印链表、求链表长度、判断是否包含关键字

与单链表的形式相同

 public void  disPlay(){ListNode cur = head;while (cur!=null){ System.out.print(cur.val+" ");cur = cur.next;}System.out.println();}/***求链表长度* @return int*/public int size(){ListNode cur = head;int count = 0;while (cur!=null){count++;cur = cur.next;}return count;}/*** 查看在链表中是否包含关键字key* @param key* @return*/public boolean contains(int key){ListNode cur = head;while (cur != null){if (cur.val == key){return true;}cur = cur.next;}return false;}

3. 头插法和尾插法

在这里插入图片描述

    /*** 头插法* o(1)* @param data*/public void addFirst(int data){ListNode node = new ListNode(data);if (head ==null){head = node;last = node;}else {node.next = head;head.prev = node;head = node;//头结点前移}}/*** 尾插法o(1)*/public void addLast(int data){ListNode node = new ListNode(data);if(head==null){head = node;last = node;}else{last.next = node;node.prev = last;last = node;}}  

因为尾插的时候有last结点,不用进行尾结点的遍历查找
所以双链表尾插的时间复杂度是 o(1)

4.在任意位置插入

在这里插入图片描述

  public void addIndex(int index, int data) {if (index < 0 || index > size()) {//判断索引是否超出return;}if (index == 0) {//利用头插addFirst(data);return;}if (index == size()) {//利用尾插addLast(data);return;}ListNode node = new ListNode(data);ListNode cur = head;while (index!=0){//找到索引的位置cur = cur.next;index--;}node.next = cur;cur.prev.next = node;node.prev = cur.prev;cur.prev = node;}

1.先判断索引下标是否溢出
2.如果索引是开头或者末尾的位置,调用写好的头插法和尾插法
3.通过遍历找到索引的位置cur
4.将cur插入链表中

  • 先改变node的next域,
  • 将node与cur相连 将cur的前驱的next域,改为node,
  • 将node与cur的前一个结点相连
  • 将node前驱改为cur前驱的地址 将cur的前驱改为node的地址值

5.删除结点

在这里插入图片描述

    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;//head的前驱置为空}} else {//删除中间或者尾部cur.prev.next = cur.next;if (cur == last) {//如果是尾部last = last.prev;} else {//删除的是中间cur.next.prev = cur.prev;}}return;}cur = cur.next;}}

1.通过遍历找到值等于key的结点
2.如果要删的是头结点,头结点向后移动一位。如果移动后的头结点不为空,将此时头结点的前驱置为空
3.如果要删除的cur是尾结点,将cur前驱的地址值指向cur的下一个地址,将last向前移动一位
4.如果要删除的是中间结点,将cur前驱的地址值指向cur的下一个地址,将cur后继的前驱指向cur的前驱

6.清空链表

在这里插入图片描述

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

1.遍历链表,用curNext记录cur的下一个结点
2.将cur的前驱和后继置为null
3.将头结点和尾结点置为空。

点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

VSCode 自动修改闭合标签

1.打开应用商店&#xff0c;搜索 auto rename tag &#xff0c;选择第一个&#xff0c;点击安装。 2.安装完毕后随便打开一个 HTML 文件&#xff0c;当我们修改起始标签时&#xff0c;闭合标签也会自动更改。 原创作者&#xff1a;吴小糖 创建时间&#xff1a;2023.10.25

ChineseChess2

中国象棋&#xff1a;黑将&#xff0c;红帅双炮&#xff0c;只要红帅中间露头怎么走怎么赢 卡主黑将的走位&#xff0c;控制住就好了 ChineseChess-CSDN博客

酒石酸盐晶体是优质葡萄酒的一个特征?

来自云仓酒庄品牌雷盛红酒分享澄清一下&#xff0c;葡萄酒中的酒石酸盐晶体&#xff0c;在德国被称为“温斯坦”&#xff0c;既无害也不是质量差的标志&#xff0c;相反&#xff0c;它们是富含矿物质的葡萄酒的特征。虽然酒石酸盐可以在年轻的葡萄酒中结晶&#xff0c;但它们最…

unity脚本_Mathf和Math c#

首先创建一个脚本 当我们要做一个值趋近于一个值变化时 可以用Mathf.Lerp(start,end,time);方法实现 比如物体跟随

通过IP地址可以做什么

通过IP地址可以做很多事情&#xff0c;因为它是互联网通信的基础之一。本文将探讨IP地址的定义、用途以及一些可能的应用。 IP地址的用途 1. 设备标识&#xff1a;IP地址用于标识互联网上的每个设备&#xff0c;这包括计算机、服务器、路由器、智能手机等。它类似于我们日常生…

折纸问题

折纸的次数 —— 从上到下的折痕 本质上是中序遍历的问题&#xff0c;因为每一次在已有的折痕后折的时候&#xff0c;当前折痕上的折痕一定为凹&#xff0c;当前折痕下的折痕一定为凸 。实际模拟了一个不存在的二叉树结构的中序遍历。 注&#xff1a;折纸折几次整颗二叉树就有…

超好用的数据可视化工具推荐,小白也适用!

Excel、Tableau……可以做数据可视化的工具不少&#xff0c;但简单、好用又高效&#xff0c;甚至连无SQL基础的小白也能轻松使用的就真没几个。奥威BI数据可视化工具是少有的操作难度低、成本支出低、灵活自助分析能力强的BI工具。 1、操作难度低 奥威BI数据可视化工具的操作…

C++(Qt)软件调试---线程死锁调试(15)

C(Qt)软件调试—线程死锁调试&#xff08;15&#xff09; 文章目录 C(Qt)软件调试---线程死锁调试&#xff08;15&#xff09;1、前言2、常见死锁3、linux下gdb调试C死锁1.1 使用代码1.2 gdb调试 3、linux下gdb调试Qt死锁1.1 使用代码1.2 gdb调试 4、Windows下gdb调试C死锁5、W…

哪些车企AEB标配率「不及格」

对于汽车智能化来说&#xff0c;基础安全不分高低配。但实际情况&#xff0c;却是另一番景象。 在全球范围&#xff0c;目前不少国家及地区的监管机构正在考虑将AEB&#xff08;紧急制动系统&#xff09;作为乘用车的标配纳入法规&#xff0c;“这是道路安全向前迈出了重要的一…

2023年9月青少年机器人技术(三级)等级考试试卷-理论综合

2023年9月青少年机器人技术等级考试&#xff08;三级&#xff09;理论综合试卷 单选题 第 1 题 单选题 Arduino Nano主控板&#xff0c;通过光敏电阻控制LED灯亮度的变化。电路搭设及程序如下图所示&#xff0c;当光照强度逐渐增强时&#xff0c;LED的亮度逐渐减弱&#xff…

CentOS 7设置固定IP地址

当我们安装了一个虚拟机或者装了一个系统的时候&#xff0c;经常会遇到需要设置固定ip的情况&#xff0c;本文就以Centos 7为例&#xff0c;讲述如何修改固定IP地址。 1、用ifconfig命令查看使用的网卡 如上图所示&#xff0c;我们就会看到我们目前使用的网卡名称 2、编辑网卡…

Systemd服务内存占用高的处理

参考文章 ### https://blog.csdn.net/weixin_44821644/article/details/121095406## https://blog.csdn.net/c123m/article/details/124301104 现象 检查 操作系统是4C8G&#xff0c;systemd的内存使用率比较高。操作系统日志没看到异常。很多服务通过systemd托管 ## 检查有…

(三)(Driver)驱动开发之双机调试环境搭建及内核驱动的运行

文章目录 1. 驱动开发环境搭建2. 驱动开发新建项目及项目属性配置和编译3. 双机调试环境搭建3.1 安装虚拟机VMware3.2 配置Dbgview.exe工具3.3 基于Windbg的双机调试 4. 内核驱动的运行4.1 临时关闭系统驱动签名校验4.2 加载驱动 1. 驱动开发环境搭建 请参考另一篇:https://bl…

7. Cesium中的Primitive

1. Primitive 介绍 在 Cesium 中&#xff0c;Primitive 是一种基本的图元&#xff0c;用于呈现 3D 场景中的几何形状、材质和其他属性。 Primitive 由两个部分组成&#xff0c;一个是几何形状&#xff08;Geometry&#xff09;&#xff0c;用于定义 Primitive 的结构&#xf…

Guava-RateLimiter详解

简介&#xff1a; 常用的限流算法有漏桶算法和令牌桶算法&#xff0c;guava的RateLimiter使用的是令牌桶算法&#xff0c;也就是以固定的频率向桶中放入令牌&#xff0c;例如一秒钟10枚令牌&#xff0c;实际业务在每次响应请求之前都从桶中获取令牌&#xff0c;只有取到令牌的请…

Unity Spine 指定导入新Spine动画的默认材质

指定导入新Spine动画的默认材质 找到Spine的Editor导入配置如何修改方法一: 你可以通过脚本 去修改Assets/Editor/SpineSettings.asset文件方法二&#xff1a;通过面板手动设置 找到Spine的Editor导入配置 通常在 Assets/Editor/SpineSettings.asset 配置文件对应着 Edit/Prefe…

wxPython 布局调试技巧

在Show()与MainLoop()直接加入以上代码 import wx.lib.inspection ...frame.Show() wx.lib.inspection.InspectionTool().Show() app.MainLoop()启动后会弹出布局查看工具

蓝桥杯每日一题2032.10.24

蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由于布局为两个字节为一行&#xff0c;那我们输入两个数就为一行&#xff0c;但是这两个数全部得用二进制进行表示使用bitset bitset:将一个数转化为二进制 bitset<8>:将一个数转化为8位…

【Unity3D】Unity与Android交互

1 Unity 发布 apk 1.1 安装 Android Build Support 在 Unity Hub 中打开添加模块窗口&#xff0c;操作如下。 选择 Android Build Support 安装&#xff0c;如下&#xff08;笔者这里已安装过&#xff09;。 创建一个 Unity 项目&#xff0c;依次点击【File→Build Settings→…

springboot maven项目环境搭建idea

springboot maven项目环境搭建idea 文章目录 springboot maven项目环境搭建idea用到的软件idea下载和安装java下载和安装maven下载和安装安装maven添加JAVA_HOME路径&#xff0c;增加JRE环境修改conf/settings.xml&#xff0c;请参考以下 项目idea配置打开现有项目run或build打…