通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现

文章目录

    • 节点类
    • 链表类(主要)
    • 测试类
    • 小结


节点类

可以根据需要,对节点属性进行修改。注意重写toString()方法,以便后续的输出操作。

//节点类
class Node {public int id;public String name;public Node next;public Node(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "Node{" +"id=" + id +", name='" + name + '\'' +'}';}
}

链表类(主要)

所实现的增删改查,反转,逆序等功能基本能适用。实现思路在代码中注释。

//链表类(管理节点)
class LinkedList {//头节点Node head = new Node(0,null);//链表有效数据个数(链表长度)(头节点不计)public int size(){Node temp = head;int size = 0;while (true){if (temp.next == null){break;}size++;temp = temp.next;}return size;}//展示链表public void list(){if (head.next == null){System.out.println("链表为空!");return;}Node temp = head.next;while (true){if (temp == null){break;}System.out.println(temp);temp = temp.next;}}//增(根据id从小到大)public void add(Node newNode){Node temp = head;while (true){ //用来找到链表尾if (temp.next == null) {break;}if (temp.id == newNode.id){System.out.println("要添加的节点的id已经存在,添加失败!");return;}if (temp.next.id > newNode.id){break;}temp = temp.next;}Node node = newNode;newNode.next = temp.next;temp.next = node;}//删(根据id匹配删除)public void remove(int id){if (head.next == null){System.out.println("链表为空!");return;}Node temp = head;boolean flag = false; //用来标记是否找到对应id的节点while (true){if (temp.next == null){break;}if (temp.next.id == id){ //找到要删除节点的前一个节点flag =true;break;}temp = temp.next;}if (flag){temp.next = temp.next.next;}else {System.out.println("没有找到要删除的节点,删除失败!");}}//改(根据id匹配要修改的节点)public void update(int id,String name){if (head.next == null){System.out.println("链表为空!");return;}Node temp = head;boolean flag = false; //用来标记是否找到对应id的节点while (true){if (temp.next == null){break;}if (temp.id == id){flag = true;break;}temp = temp.next;}if (flag){temp.name = name;}else {System.out.println("没有找到要修改的节点,修改失败!");}}//查(根据id匹配)public Node show(int id){if (head.next == null){System.out.println("链表为空!");return null;}Node temp = head.next;boolean flag = false;while (true){if (temp == null){break;}if (temp.id == id){flag = true;break;}temp = temp.next;}if (flag){return temp;}else {System.out.println("没有找到要查找的节点,查找失败!");return null;}}//查找倒数第n个节点public Node lastShow(int n){Node temp = head.next;int size = this.size();if (size < n || n <= 0){System.out.println("查找的节点不存在!");return  null;}for (int i = 0; i < size - n; i++) {temp = temp.next;}return temp;}//链表反转public void reverse(){if (head.next == null || head.next.next == null){return;}Node reverseHead = new Node(0,null);Node cur = head.next; //记录当前遍历到的节点Node next = null; //记录当前遍历到的节点的下一个节点while (true){if (cur == null){ //确保遍历到最后一个break;}next = cur.next; //保存下一个节点,避免断链//使得反转头节点指向遍历到的当前节点,而让遍历到的当前节点指向反转头节点的下一个节点// 确保遍历到的当前节点始终位于反转头节点的下一个cur.next = reverseHead.next;reverseHead.next = cur;//遍历cur = next;}head.next = reverseHead.next; //最后让原头节点指向反转头节点的下一个节点,即可实现原链表的反转}//逆序打印//方法一:先反转//方法二:使用栈结构public void reversePrint(){if (head.next == null){System.out.println("链表为空!");return;}Stack<Node> nodes = new Stack<>();Node temp = head.next;while (true){if (temp == null){break;}nodes.push(temp);temp = temp.next;}while (nodes.size() > 0){System.out.println(nodes.pop());}}
}

测试类

import java.util.Stack;/*** @Author: Yeman* @Date: 2021-10-14-12:55* @Description:*/
//测试类
public class SingleLinkedListTest {public static void main(String[] args) {LinkedList linkedList = new LinkedList();Node node1 = new Node(1, "阿兰");Node node2 = new Node(2, "洛国富");Node node3 = new Node(3, "艾克森");//可以不按照id顺序添加linkedList.add(node1);linkedList.add(node3);linkedList.add(node2);linkedList.list();System.out.println(linkedList.size()); //链表长度//        System.out.println(linkedList.lastShow(2)); //倒数查找//        linkedList.update(2,"张玉宁"); //改
//
//        linkedList.remove(3); //删
//
//        System.out.println(linkedList.show(2)); //查//        linkedList.reverse(); //链表反转linkedList.reversePrint(); //逆序打印}
}

小结

单链表的节点由具体数据域和指针域两部分组成,而带有头节点的单链表的头节点不存储具体数据,其指针域则指向链表的第一个有效节点,即非头节点的第一个节点。

当对单链表进行增删改查,逆序等操作时,要定义一个Node类型的辅助变量来遍历链表,而头节点注意要保持不动。

进行反转操作时,最后需要使得头节点指向反转后的链表的第一个节点,这是唯一一处使得头节点变动的地方。

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

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

相关文章

Java 10 – JEP 286:局部变量类型推断

Java 10即将发布&#xff0c;RC Build可在此处获得 。 可在此处找到此发行版的目标功能。 在针对Java 10的所有JEP中&#xff0c;开发人员社区中最有趣且最受关注的是286&#xff1a;Local-Variable Type Inference 。 什么是局部变量类型推断&#xff1f; 我们在Java 8中看到…

w ndows7与XP哪个好,Win7系统与Win XP系统哪个更好?Windows7与WindowsXP区别介绍-系统城·电脑系统下载之家...

虽然微软已经停止对xp系统的维护&#xff0c;但是仍有不少用户有这样一个疑惑&#xff1a;Win7系统与WinXP系统哪个更好&#xff1f;接下来&#xff0c;小编就向大家具体介绍Windows7与WindowsXP的区别&#xff0c;让你知道到底哪个系统会更好一些。首先跟系统城小编一起来看微…

一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接

文章目录笛卡尔乘积连接查询分类等值连接非等值连接自连接外连接交叉连接连接查询又称为多表查询&#xff0c;当查询的字段来自于多个表时&#xff0c;使用连接查询。 笛卡尔乘积 笛卡尔乘积现象&#xff1a;表1有m行&#xff0c;表2有n行&#xff0c;结果有m*n行 发生原因&a…

android 自定义表单,Android实现Ant Design 自定义表单组件

Ant Design 组件提供了Input&#xff0c;InputNumber&#xff0c;Radio&#xff0c;Select&#xff0c;uplod等表单组件&#xff0c;但实际开发中这是不能满足需求&#xff0c;同时我们希望可以继续使用Form提供的验证和提示等方法(使用起来确实很爽)&#xff0c;这时需要自己动…

逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查

文章目录节点类链表类测试类双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。 节点类…

【PostmanJMeter】使用Postman和JMeter进行signature签名

一、前言 ​ 有些接口的请求会带上sign&#xff08;签名&#xff09;进行请求&#xff0c;各接口对sign的签名内容、方式可能不一样&#xff0c;但一般都是从接口的入参中选择部分内容组成一个字符串&#xff0c;然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会…

詹金斯搭建_詹金斯的Maven报告

詹金斯搭建代码质量是一个敏感的话题。 它会影响您的维护成本以及客户满意度。 更不用说您的开发人员使用代码的动力了。 谁想要修复难看的代码&#xff0c;对吗&#xff1f; 讨论代码质量总是需要事实和数字&#xff01; 因此&#xff0c;这是一个简短的教程&#xff0c;介绍…

android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...

我在我的电脑上执行java服务器并让我的android设备连接到它。我可以连接它&#xff0c;但一旦连接就会断开连接。我确信在android方面我需要做一些事情&#xff0c;但我很少迷失它。我有互联网许可&#xff0c;所以很好。Android tcp客户端连接&#xff0c;然后从java服务器断开…

Oracle应用容器云的自由

在这篇博客文章中&#xff0c;我将介绍如何部署CloudEE封装在杜克大学应用自由尤伯杯罐子Oracle应用集装箱云端 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件&#xff0c;其中包含应用程序ber-jar和清单文件&#xff08;manifest.json&…

android已经点击,【已解决】android中点击其他的(如Button等)但是EditText却没有失去焦点...

【问题】android的app中&#xff0c;在对于EditText已经实现了&#xff1a;OnFocusChangeListener mFocusChangedListener;EditText variableValueView (EditText) variableLayout.findViewById(R.id.variableValue);EditText variableValueView (EditText) variableLayout.f…

简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

文章目录简单介绍代码实现简单介绍 如果把单链表的最后一个节点的指针指向链表头部&#xff0c;而不是指向NULL&#xff0c;那么就构成了一个单向循环链表&#xff0c;通俗讲就是让尾节点指向头结点。 单向环形链表应用场景&#xff1a;Josephu(约瑟夫、约瑟夫环)问题&#xf…

荣耀v10Android9新功能,荣耀10、荣耀V10开启安卓9.0内测 日常领跑行业

【PConline 资讯】今天(8月9日)早上10点&#xff0c;荣耀总裁赵明发微博宣布荣耀已经有四款机型面向少部分用户推送安卓9.0内部测试版本。实际上&#xff0c;在8月8日晚上&#xff0c;花粉论坛就已经公布华为4款机型内测安卓 9.0 版本&#xff0c;荣耀手机两款旗舰进入升级名单…

状态模式 设计模式_设计模式:状态

状态模式 设计模式本文将介绍状态设计模式 。 它是行为设计模式之一 。 您无需了解许多理论即可了解模式的主要概念。 该文章将分为几个部分&#xff0c;在其中我将提供有关需要应用该模式的情况&#xff0c;它所具有的利弊以及用法示例的信息。 有时&#xff0c;当对象的内部…

字符串得结果!Java数组模拟栈以实现中缀表达式综合计算器,字符串表达式计算器

文章目录数组模拟栈类中缀表达式计算器类&#xff08;测试类&#xff09;数组模拟栈类 主要实现栈的一些基本功能&#xff0c;以及在该场景下的功能。 //先创建一个栈 class AStack {private int maxSize; //栈的大小private int[] stack; //数组模拟栈private int top -1; …

android webview javascript不执行,WebView中的JavaScript为什么不执行?

浏览器未开启javascript使用的js代码有问题&#xff0c;webview不兼容该代码。1) 第一个坎&#xff1a;WebSettingsWebSettings webSettings mWebView.getSettings();webSettings.setJavaScriptEnabled(true);2) 第二个坎&#xff1a; 有物在运行脚本前&#xff0c;要有docume…

中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现

文章目录中缀表达式转后缀表达式思路逆波兰表达式计算思路代码实现中缀表达式转后缀表达式思路 1、初始化两个栈&#xff1a;运算符栈s1和储存中间结果的栈s2 2、从左至右扫描中缀表达式 3、遇到操作数时&#xff0c;将其压入s2 4、遇到运算符时&#xff0c;比较其与s1栈顶…

Java中的AES加密和解密(CBC模式)

通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响&#xff0c;始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法。在本文中&#xff0c;我们将讨论Java中具有CBC模式的AES&#xff08;高级加密标准&#xff09;对称加密…

hiti打印机android驱动,HiTi 打印机 驱动程序下载——更新 HiTi 软件

HiTi 打印机驱动程序下载如何手动下载和更新:你可以通过 %%os%% 或通过执行 Windows 更新获取基本的 HiTi Printer 驱动程序。 内置驱动程序将支持Printer的基本功能&#xff0c;但通常不支持更高级的功能。以下是手动更新这些 HiTi 设备驱动程序的完整指南。程序员: HiTi 类别…

Java实现最小二乘法线性拟合,传感与检测,单臂半桥全桥实验,江南大学自动化

因为作为资源上传不方便我们获取且我想免费分享给有需要的小伙伴&#xff0c;以后所有实验报告都通过文章形式记录输出了&#xff0c;仅供参考&#xff0c;欢迎交流。&#xff08;最小二乘法代码在文末&#xff09; 电桥特性曲线&#xff1a; Java实现最小二乘法线性拟合及计算…

android task详解,Android AsyncTask的使用详解

当然&#xff0c;我们在进行耗时操作或者更新UI时&#xff0c;是可以使用匿名线程的&#xff0c;但是此种方式是存在缺陷的&#xff1a;第一&#xff0c;线程的开销较大&#xff0c;如果每个任务都要创建一个线程&#xff0c;那么应用 程序的效率要低很多&#xff1b;第二&…