Java 单链表的实现与反转

2023-10-29

Java 实现单链表以及单链表的反转

package test;
import java.util.Iterator;
public class LinkList<T> implements Iterable<T>{
	// 头节点
	private Node head;
	// 记录链表长度
	private int N;
	
	public LinkList(){
		// 初始化头节点
		head = new Node(null, null);
		N = 0;
	}
	
	// 清空链表
	public void clear(){
		head.item = null;
		head.next = null;
		N = 0;
	}
	
	// 获取链表长度
	public int length(){
		return N;
	}
	
	// 判断链表是否为空
	public boolean isEmpty(){
		return N==0;
	}
	
	// 获取指定位置i处的值
	public T get(int i){
		if(i<0 || i>=N){
			throw new RuntimeException("位置不合法!");
		}
		Node n = head.next;
		for(int index = 0; index < i; index++){
			n = n.next;
		}
		return n.item;
	}
	
	// 向链表中插入元素t
	public void insert(T t){
		Node n = head;
		// 找到最后一个节点
		while(n.next != null){
			n = n.next;
		}
		Node newNode = new Node(t,null);
		n.next = newNode;
		N++;
	}
	
	// 向指定位置i处插入元素t
	public void insert(int i, T t){
		if(i < 0 || i >= N){
			throw new RuntimeException("位置不合法!");
		}
		// 找到位置i的前一个节点
		Node pre = head;
		for(int index = 0; index <= i-1; index++){
			pre = pre.next;
		}
		// 位置i上的节点
		Node curr = pre.next;
		// 让待插入节点的下一个节点指向当前i所在的节点
		Node newNode = new Node(t, curr);
		// 让位置i的前一个节点的下一个节点指向新节点
		pre.next = newNode;
		// 链表长度加一
		N++;
	}
	
	// 删除指定位置i处的节点,并返回被删除元素
	public T remove(int i){
		if(i < 0 || i >= N){
			throw new RuntimeException("位置不合法!");
		}
		// 找到位置i的前一个节点
		Node pre = head;
		for(int index = 0; index <= i-1; index++){
			pre = pre.next;
		}
		// 位置i处节点
		Node curr = pre.next;
		// 让i处节点的前一个节点的下一个节点指向i处节点的下一个节点
		pre.next = curr.next;
		// 长度减一
		N--;
		return curr.item;
	}
	
	// 查找元素t在链表中第一次出现的位置
	public int indexOf(T t){
		// 遍历整个链表
		Node n = head.next;
		for(int index = 0; index < N; index++){
			// 找到相等的值就退出循环
			if(n.item.equals(t)){
				return index;
			}
			n = n.next;
		}
		return -1;
	}
	/**
	 * 节点类
	 * @author Administrator
	 *
	 */
	private class Node{
		// 节点数据
		T item;
		// 下一个节点
		Node next;
		public Node(T item, Node next){
			this.item = item;
			this.next = next;
		}
	}
	@Override
	public Iterator<T> iterator() {
		return new MyIterator();
	}
	
	private class MyIterator implements Iterator<T>{
		
		private Node n;
		
		public MyIterator(){
			this.n = head;
		}

		@Override
		public boolean hasNext() {
			return n.next != null;
		}

		@Override
		public T next() {
			n = n.next;
			return n.item;
		}
		
	}
	
	public void reverse(){
		if(N == 0){
			return;
		}
		reverse(head.next);
	}
	/**
	 * 使用递归完成反转,从原链表的第一个节点开始,依次递归调用反转每一个节点,
	 * 直到把最后一个节点反转完毕,整个链表就反转完毕。
	 * @param curr 当前遍历的节点
	 * @return 反转后当前节点的上一个节点
	 */
	public Node reverse(Node curr){
		// 已经到了最后一个节点
		if(curr.next == null){
			// 头节点的下一个节点指向原链表的最后一个节点
			head.next = curr;
			return curr;
		}
		// 递归调用,对下一个节点进行反转
		Node pre = reverse(curr.next);
		pre.next = curr;
		curr.next = null;
		return curr;
	}
}

测试类:

package test;

public class TestClass {

	public static void main(String[] args) {
		LinkList<String> list = new LinkList<>();
		list.insert("张三");
		list.insert("李四");
		list.insert("王五");
		list.insert("赵六");
		System.out.println("length:" + list.length());
		System.out.println("赵六所在位置:" + list.indexOf("赵六"));
		System.out.println("_______________");
		// 测试插入
		list.insert(2, "xiaoli");
		for(String s : list){
			System.out.println(s);
		}
		// 测试删除
		list.remove(3);
		System.out.println("_______________");
		for(String s : list){
			System.out.println(s);
		}
		System.out.println("_______________");
		// 测试链表反转
		list.reverse();
		for(String s : list){
			System.out.println(s);
		}
	}

}

结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 单链表的实现与反转 的相关文章

  • 是否可以在 Spring Batch 中结合分区和并行步骤?

    我只是想知道它在 Spring Batch 中可行吗 Step1Step2 流程 gt 流程1 流程2 流程3 Step3 其中每个flow1 gt 划分为 5 个 GridSizeflow2 gt 划分为 5 个 GridSizeflow
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新

随机推荐

  • python flask介绍

    python flask介绍 Flask是一个使用Python编写的轻量级Web应用框架 基于Werkzeug WSGI工具箱和Jinja2 模板引擎 Flask使用BSD授权 Flask也被称为 microframework 因为它使用简
  • 抓包工具大全整理

    一 使用Chrome的开发者工具 用Chrome捕获12306登录的POST请求 Chrome开发者工具在抓包时 如果页面发生了跳转 那么会把上一个页面的HTTP请求清空 此时需要选中Preserve log 以保留上次抓到的包 我们用Ch
  • react 字段值空判断_React原理解析第一篇:核心概念

    作为一个构建用户界面的库 React的核心始终围绕着更新这一个重要的目标 将更新和极致的用户体验结合起来是React团队一直在努力的事情 为什么React可以将用户体验做到这么好 我想这是基于以下两点原因 Fiber架构和Scheduler
  • IPv6扩展头部 (一) 扩展头部格式、类型与扩展选项

    之前几篇博客介绍了IPv6的扩展头部 包括分片头部和路由头部 接下来介绍一下IPv6扩展头部以及扩展选项的内容 可能会有这样的疑问 有了扩展头部怎么还需要扩展选项 扩展选项是干嘛用的 本篇博客就介绍相关内容 IPv6扩展头部 在IPv6中
  • SimpleDES

    转载 学习 http pigheadx me blog 2011 04 s desalgorithm 下面从准备知识开始 C 使用bitset数据结构进行与或位运算 1 置换 举例说明 对 ABCDEFGH 做一下 82641753 置换的
  • rt-thread stm32f407+lan8720 lwip应用

    硬件资源 正点原子stm32f407 探索者开发板 板载Lan8720以太网芯片 操作系统 rt thread 4 0 1 实验目的 1 实现ping功能 能够ping通外网 2 实现Telnet功能 能够使用类似于CRT这种工具进行远程连
  • 面向对象五大设计原则-开放封闭原则

    1 开放封闭原则 开放封闭原则 Close Open Principle 是指软件应该对扩展开放 而对修改封闭 在软件的生命周期内 需求变化是客观存在的且不以人的意志而转移 而对应的软件也必须做相应的变化 对扩展开放 意味着有新的需求或变化
  • 章鱼网络,构建未来Web3弹性之网

    全长8698字 预计阅读 23 分钟 嘉宾 刘毅 撰文 MiX 微信交流 mixcross919 章鱼网络的愿景 大幅降低Web3 0应用链 Appchain 的启动 运行和创新门槛 将启动应用链的成本从几百万美金降低到几万美金 只有把门槛
  • 感悟--学习一个新东西

    总结学习一个新东西 当学习更高的层次的东西 看原来之前学过的东西觉的不在难 最开始学习jsp标签 nginx 使用 原因是 没有站在高纬度视角 不知道我站在哪里 本以为是个大山 其实是就是山谷中一棵大树上的一片页里的细节脉络 以下按照顺序来
  • 端口被占用怎么解

    1 首先打开命令行窗口 在搜索栏输入cmd 选择命令提示 2 在命令提示窗口输入 netstat ano 找到端口对应的PID 我要找的是端口3000 所以对应PID就是29916 3 继续输入 netstat ano findstr PI
  • Python数据驱动ddt模块,与测试报告的生成

    数据驱动ddt模块 与测试报告的生成 与上一篇博客一样拿登录测试来讲 首先建立一个命名为login py的文件 并写上登录过程中需要调用的方法login check def login check username password par
  • Java中如何生成6个不重复的随机数一次性成功!

    在使用Java生成随机数时 这里有两种方式 是使用Set的不可重复性 来生成的 下面我们来看代码 public class RandomTest public static void main String args Set
  • 企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

    工程项目管理软件 工程项目管理系统 对建设工程项目管理组织建设 项目策划决策 规划设计 施工建设到竣工交付 总结评估 运维运营 全过程 全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一 系统管理 1 数据字典 实现对数据字典标签
  • 《面试准备》c/c++全排列问题

    问题描述 排列 从n个元素中任取m个元素 并按照一定的顺序进行排列 称为排列 全排列 当n m时 称为全排列 比如 集合 1 2 3 的全排列为 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2 算法思路 1 n个元素
  • 扩展实体

    扩展实体对象Xrecord 它是AcDbxrecord的对象实例 扩展实体对象实际上是结果缓冲区列表 存储一个数据组列表 每一个节点都有一个DXF码来标示实体的类型 设置和获取结果缓冲区链表 Acad ErrorStatusAcDbXrec
  • 正态分布西格玛越大_正态分布中什么是1 sigma原则,2sigma原则,3sigma原则

    sigma原则 数值分布636f707962616964757a686964616f31333431366431在 中的概率为0 6526 2sigma原则 数值分布在 2 2 中的概率为0 9544 3sigma原则 数值分布在 3 3
  • Python3 AttributeError: module ‘cv2‘ has no attribute ‘SIFT‘ ‘module‘ object has no attribute ‘xfea

    在用python3使用sift cv2 SIFT 进行SIFT时候 可能会产生错误 AttributeError module cv2 has no attribute SIFT 解决 将sift cv2 SIFT 替换为 sift cv2
  • 2023前端面试题(含答案)

    set map区别 1 Map是键值对 Set是值的集合 2 Map可以通过get方法获取值 而set不能 因为它只有值 3 都能通过迭代器进行for of遍历 4 Set的值是唯一的可以做数组去重 Map由于没有格式限制 可以做数据存储
  • flutter 点九设置

    1 上边和左边是拉伸区域 右边和下边是填充区域 2 fromLTRB fromLTWH设置区域 3 fromLTRB设置区域 说的不是很清晰 4 centerSlice的理解 拉伸区域 可以单纯的理解为对某块像素进行拉伸 那块像素自然就变得
  • Java 单链表的实现与反转

    Java 实现单链表以及单链表的反转 package test import java util Iterator public class LinkList