Java-单链表相关总结

2023-10-26

链表基类

/***
*@author: Q.sir
*@date:2021-06-08
*@desc:仅限本类操作,有些方法未加兼容及拓展
*/
class Node {
	Node next;
	int data;
	public Node(int data) {
		this.data = data;
	}
}

链表相关操作, 增删改查 排序, 去重,链表反转 等, 以linkeLIst,数据类型为int为例, 若兼容其他适用泛型做兼容。

class LinkeList {
	Node head = null;
	
	/**
	** 添加新的数据
	*@data 
	**/
	public add(int data) {
		Node newNode = new Node(data);
		if(head == null) {
			head = newNode;
			return;//结束该判断,向下执行。
		}
		Node temp = head;
		while(temp.next != null) {
			temp = temp.next;
		}
		temp.next = newNode;
	}

	public boolean deleate(int index) {
		if(index < 0 || index > length()) return true;
		if(index == 0) {
			head = head.next;
			return true;
		}
		int i;
		Node preNode = head;
		Node curNode = preNode.next;
		while(curNode.next != null) {
			if(i == index) {
				curNode = curNode.next;
				return true;
			}
			curNode
		}
		return true;
	}

	public Node sort() {
		Node currNode = head;
		while(currNode != null) {
			Node nextNode = currNode.next;
			while(nextNode != null) {
				if(currNode.data > nextNode.data) {
					int temp = currNode.data;
					currNode.data = nextNode.data;
					nextNode.data = temp;
				}
				nextNode =nextNode.next;
			}
			currNode = currNode.next;
		}
	
	}
	
	public void print() {
		Node currNode = head;
		while(currNode != null) {
			System.out.print(currNode.data + "\n");
			currNode = currNode.next;
		}
	}
	
	/**
	*去除重复元素
	*@return返回重复数据
	**/
	public Node distinct() {
		Node temp = head;
		Node pre = null;
		HashTable<Integer, Integer> ht = new HashTable<>();
		while(temp != null) {
			if(ht.containKey(temp.data)) {
				pre.next = temp.next;
			} else {
				ht.put(temp,data, 1);
				pre = temp;
			}
			temp = temp.next;
		}
		return pre;
	}

	/**
	*查找index 之后的数据
	*@index index 节点
	*@return 返回index结点之后的数据
	*/
	public Node findLastNode(int index) {
		if(index < 0 || index > length()) return null;
		Node first = head;
		Node second = head;
		for(int i = 0; i < k - 1; i++) first = first.next;
		while(first != null) {
			first = first.next;
			second = second.next;
		}
		return second;
	}
	
	/**
	*查找第几个链表元素
	*@index 元素下标
	*@return 返回元素
	*/
	public Node find(int index) {
		if(index < 0 || index > length()) return null;
		int i = 0;
		Node currNode = head;
		while(i == (index - 1)) {
			currNode = currNode.next;
			i++;
		}
		return currNode;
	}
	
	//链表反转
	public Node reserve() {
		Node cur = head;
		Node pre = null;
		while(cur != null) {
			Node next = cur.next;
			cur.next = pre;
			pre = cur;
			cur = next;
		}
		return head;
	}	

	//查找中间链表
	public Node findMiddleNode() {
		Node slow = head;
		Node quick = head;
		while(quick.next != null && quick.next.next != null) {
			slow = slow.next;
			quick = quick.next.next;
		}
		return slow;
	}

	//判断链表是否有环
	public boolean isRinged() {
		if(head == null) return false;
		Node slow = head;
		Node quick = head;
		while(quick.next != null && quick.next.next != null) {
			slow = slow.next;
			quick = quick.next.next;
			if(slow == quick) return ture;
		}
		return false;
	}

	//获取列表最后一个节点
	public Node getLastNode() {
		Node cur = head;
		while(cur.next != null) {
			cur = cur.next;
		}
		return cur;
	}

	//删除节点数据 头部不确定
	public boolean deleteNode(Node node) {
		if(n.next == null) {
			return false;
		} else {
			int temp = n.data;
			n.data = n.next.data;
			n.next.data = temp;
			n.next = n.next.next;
			return ture;
		}
	}

	//判断两个量表是否相交
	public boolean isCross(Node h1, Node h2) {
		Node tem1 = h1;
		Node tem2 = h2;
		while(tem1.next != null) tem1 = tem1.next;
		while(tem2.next != null) tem2 = tem2.next;
		if(tem1 == tem2) return true;
		return false; 
	}

	//判断两个链表是否相交且返回相交节点
	public Node findCrossNode(Node h1, Node h2) {
		if(!isCross(h1, h2)) {
			return null;
		} else {
			int len1 = h1.length();
			int len2 = h2.length();
			Node tem1 = h1.head;
			Node tem2 = h2.head;
			int len = len1 - len2;
			if(len > 0) {
				for(int i = 0; i < len; i++) {
					tem1 = tem.next;
				}
			} else {
				for(int i = 0; i < (-len); i++) {
					tem2 = tem2.next;
				}
			}
			while(tem1 != tem2) {
				tem1 = tem1.next;
				tem2 = tem2.next;
			}
			return tem1;
		}
		
	}

	public int length() {
		if(head == null) return 0;
		int i = 0;
		Node curNode = head;
		while(curNode.next != null) {
			curNode = curNode.next;
			i++;
		}
		return i;
	}

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

Java-单链表相关总结 的相关文章

随机推荐

  • 频率计的交流耦合和直流耦合的区别_数字示波器通道耦合与触发耦合的区别

    在电子电路中 将前级电路 或信号源 的输出信号送至后级电路 或负载 称为耦合 耦合的作用就是把某一电路的能量输送 或转换 到其他的电路中去 在示波器中 存在两种耦合设置 一种是通道的耦合方式 另外一种是触发的耦合方式 今天我们来详细说说这两
  • 超全的英语短句汇集

    English 900 英语九百句常用职位英文译名超级短句成语集锦打开话匣子PC电脑词汇一百个绝佳句型李阳英语365句托福听力常用短语校园英语迷你惯用语洋话连篇至理名言 English 900 英语九百句 Back To TOP 回到顶部
  • 程序包org.jdesktop.layout不存在

    下午用netbeans写程序 遇到程序包org jdesktop layout不存在的问题 我想这是netb自带的库啊 怎么会找不到了 原因我还没有找到 解决方法如下 找到安装netbeans的路径 在platform6 modules e
  • sql select 语句 转 Json

    最近有个Es查询的需求 用户在前端输入sql语句直接拼条件 然后后台去查询 因为es本身带有类sql查询 刚开始打算用sql查的 但是分页的limit只有一个查询条数 没有from和size 比如es可以通过类sql 的 limit 100
  • 保存图片到MySQL&从MySQL读取图片

    接上次 爬取坤坤表情包 这次我们直接将表情包存到MySQL数据库而不是本地 1 创建数据库 首先创建一个数据库 数据库名为ikun 表名为img 3个字段分别为id 图片id img 二进制码 date 存储时间 其中 二进制码的存储格式应
  • 【NATS streaming】NATS streaming 简介与安装

    1 概述 市面上常见到的和Nats功能类似的消息通信系统有 ActiveMQ KafKa RabbitMq Nats 之前是Ruby编写现已修改为Go Redis C语言编写 Kestrel Scala编写不常用 NSQ Go语言编写 这些
  • 记录自用的CAN开发调试工具和上位机

    文章目录 前言 二 CANable开源软硬件 三 AMP32F103 方案的自制USB2CAN 调试器 四 TTCAN USB2CANFD调试器 二 PyQT开发CAN调试器上位机 1 CAN通信速率可设 CAN CANFD可选 2 CAN
  • 网站建设如何快速建站_网站建设快速建站有哪些方法

    网站建设快速建站方法 1 JavaScript 压缩和模块打包 JavaScript 应用是以源码形式进行分发的 而源码解析的效率是要比字节码低的 对于一小段脚本来说 区别可以忽略不计 但是对于更大型的应用 脚本的大小会对应用启动时间有着负
  • 下载频道2013上半年超人气精华资源汇总---全都是免积分下载。

    http bbs csdn net topics 390526352 下载频道2013上半年超人气精华资源汇总 全都是免积分下载 十分感谢这些免积分分享精华资源的好人 Net 1 C 入门到精通加强版 2 C 类库查询手册 Android
  • 昆仑通泰历史数据导出到u盘_MCGS配方组导出到U盘案例-专业自动化论坛-中国工控网论坛...

    说实话 第一次玩昆仑通态的屏 客户要求的功能又很复杂 真是翔都出来了 为了各位同行的福祉 开始慢慢写一些实际应用上的东西 希望大家少走歧路 如果觉得有用就点个赞 觉得小儿科就 切 一声离开就好 ok 配方组导出到U盘的脚本如下 返回值10
  • 通过示例理解数据库相关概念(一、关系,元组,域,键,笛卡儿积等等)

    出发点 数据中的各种定义实在看不下去 太离散数学了 只有直接看例子了 少牺牲点脑细胞 但是 没有了严谨的定义 很多东西就只可意味不可言传了 通过例子可以用来理解数据库的离散数学式的定义 例子 Stu表 学号 姓名 性别 班级 201901
  • 腾讯云网站备案流程(2023新版教程)

    腾讯云网站备案流程先填写基础信息 主体信息和网站信息 然后提交备案后等待腾讯云初审 初审通过后进行短信核验 最后等待各省管局审核 前面腾讯云初审时间1到2天左右 最长时间是等待管局审核时间 网站备案地区不同管局审核时间也不同 快的3天即可通
  • 条件编译#ifdef用法

    这几个宏是为了进行条件编译 一般情况下 源程序中所有的行都参加编译 但是有时希望对其中一部分内容只在满足一定条件才进行编译 也就是对一部 分内容指定编译的条件 这就是 条件编译 有时 希望当满足某条件时对一组语句进行编译 而当条件不满足时则
  • 最大连续和(单调队列)

    最大连续和 题目描述 给你一个长度为n的整数序列 A1 A2 An 要求从中找出一段连续的长度不超过m的子序列 使得这个序列的和最大 输入描述 第一行为两个整数n m 第二行为n个用空格分开的整数序列 每个数的绝对值都小于1000 输出描述
  • 向大侠们求救!!! 想要显示jsp页面时出现HTTP Status 500 - An exception occurred processing JSP page

    错误描述 HTTP Status 500 An exception occurred processing JSP page main jsp at line 23 type Exception report message An exce
  • java.lang.OutOfMemoryError: GC overhead limit exceeded原因及解决

    https www cnblogs com penghongwei p 3603326 html https blog csdn net renfufei article details 77585294 https www jb51 ne
  • linux查看 rsync 服务状态,如何启动rsync服务

    linux查看 rsync 服务状态 如何启动rsync服务 root localhost lsof i tcp 873 开启状态 未开启状态 启动rsync服务命令 root localhost rsync daemon config e
  • windows 10 内存居高不下,实际没开多少进程

    windows 10 内存居高不下 实际没开多少进程 关闭快速启动 就好了
  • 多进程及多线程的区别

    一 两者区别 多进程和多线程的主要区别是 线程是进程的子集 部分 一个进程可能由多个线程组成 多进程的数据是分开的 共享复杂 需要用IPC 但同步简单 多线程共享进程数据 共享简单 但同步复杂 1 多进程 进程是程序在计算机上的一次执行活动
  • Java-单链表相关总结

    链表基类 author Q sir date 2021 06 08 desc 仅限本类操作 有些方法未加兼容及拓展 class Node Node next int data public Node int data this data d