Java实现单链表的各种操作
发布时间 - 2026-01-10 22:02:46 点击率:次主要内容:

- 单链表的基本操作
- 删除重复数据
- 找到倒数第k个元素
- 实现链表的反转
- 从尾到头输出链表
- 找到中间节点
- 检测链表是否有环
- 在不知道头指针的情况下删除指定节点
- 如何判断两个链表是否相交并找出相交节点
直接上代码,就是这么奔放~~~
package pers.ty.$1101datastructure;
import java.util.Hashtable;
/**
* @author Administrator
* 实现单链表的基本操作,增加删除节点、排序、打印、计算长度
*/
public class MyLinkedList {
Node head = null;//链表头的作用
/**向链表中插入数据
* @param d:插入数据的内容
*/
public void addNode(int d){
Node newNode=new Node(d);
if(head==null){
head=newNode;
return;
}
Node tmp=head;
while(tmp.next!=null){
tmp=tmp.next;
}
//add Node to end
tmp.next=newNode;
}
/**
* @param index:删除第index个节点
* @return 成功返回true,失败返回false
*/
public Boolean deleteNode(int index){
if(index<1||index>length()){
return false;//删除元素位置不合理
}
//删除链表中的第一个元素
if(index==1){
head=head.next;
return true;
}
int i=1;
Node preNode=head;
Node curNode=preNode.next;
while(curNode!=null){
if(i==index){
preNode.next=curNode.next;
return true;
}
preNode=curNode;
curNode=curNode.next;
i++;
}
return true;
}
/**
* @return 返回链表的长度length
*/
public int length(){
int length=0;
Node tmp=head;
while(tmp!=null){
length++;
tmp=tmp.next;
}
return length;
}
/**
* 对链表进行排序
* @return 返回排序后的头结点
*/
public Node orderList(){
Node nextNode=null;
int temp=0;
Node curNode=head;
while(curNode.next!=null){
nextNode=curNode.next;
while(nextNode!=null){
if(curNode.data>nextNode.data){
temp=curNode.data;
curNode.data=nextNode.data;
nextNode.data=temp;
}
nextNode=nextNode.next;
}
curNode=curNode.next;
}
return head;
}
/**
* 打印链表中所有数据
*/
public void printList(){
Node tmp=head;
while(tmp!=null){
System.out.print(tmp.data+" ");
tmp=tmp.next;
}
System.out.println();
}
/**
* 从链表中删除数据的第一种方法
* 遍历链表,把遍历到的数据存到一个Hashtable中,在遍历过程中若当前访问的值在Hashtable
* 中存在,则可以删除
* 优点:时间复杂度低 缺点:需要额外的存储空间来保存已访问过得数据
*/
public void deleteDuplecate1(){
Hashtable<Integer,Integer> table=new Hashtable<Integer,Integer>();
Node tmp=head;
Node pre=null;
while (tmp!=null) {
if(table.containsKey(tmp.data))
pre.next=tmp.next;
else{
table.put(tmp.data, 1);
pre=tmp;
}
tmp=tmp.next;
}
}
/**
* 从链表中删除重复数据的第二种方法
* 双重循环遍历
* 优缺点很明显
*/
public void deleteDuplecate2(){
Node p=head;
while (p!=null) {
Node q=p;
while(q.next!=null){
if(p.data==q.next.data){
q.next=q.next.next;
}else{
q=q.next;
}
}
p=p.next;
}
}
/**
* @param k:找到链表中倒数第k个节点
* @return 该节点
* 设置两个指针p1、p2,让p2比p1快k个节点,同时向后遍历,当p2为空,则p1为倒数第k个节点
*/
public Node findElem(Node head,int k){
if(k<1||k>this.length())
return null;
Node p1=head;
Node p2=head;
for (int i = 0; i < k-1; i++)
p2=p2.next;
while (p2.next!=null) {
p2=p2.next;
p1=p1.next;
}
return p1;
}
/**
* 实现链表的反转
* @param head链表的头节点
*/
public void reverseIteratively(Node head){
Node pReversedHead=head;
Node pNode=head;
Node pPrev=null;
while (pNode!=null) {
Node pNext=pNode.next;
if(pNext==null)
pReversedHead=pNode;
pNode.next=pPrev;
pPrev=pNode;
pNode=pNext;
}
this.head=pReversedHead;
}
/**
* 通过递归从尾到头输出单链表
* @param head
*/
public void printListReversely(Node head){
if(head!=null){
printListReversely(head.next);
System.out.print(head.data+" ");
}
}
/**
* 查询单链表的中间节点
* 定义两个指针,一个每次走一步,一个每次走两步...
* @param head
* @return q为中间节点
*/
public Node searchMid(Node head){
Node q=head;
Node p=head;
while (p!=null&&p.next!=null&&p.next.next!=null) {
q=q.next;
p=p.next.next;
}
return q;
}
/**
* 在不知道头指针的情况下删除指定节点
* 链表尾节点无法删除,因为删除后无法使其前驱节点的next指针置为空
* 其他节点,可以通过交换这个节点与其后继节点的值,然后删除后继节点
* @param n
* @return
*/
public boolean deleteNode(Node n){
if(n==null||n.next==null)
return false;
int tmp=n.data;
n.data=n.next.data;
n.next.data=tmp;
n.next=n.next.next;
return true;
}
/**
* 判断两个链表是否相交
* 如果两个链表相交,则肯定有相同的尾节点,遍历两个链表,记录尾节点,看是否相同
* @param h1链表1的头节点
* @param h2链表2的头结点
* @return 是否相交
*/
public boolean isIntersect(Node h1,Node h2){
if(h1==null||h2==null)
return false;
Node tail1=h1;
while (tail1.next!=null){
tail1=tail1.next;
}
Node tail2=h2;
while(tail2.next!=null){
tail2=tail2.next;
}
return tail1==tail2;
}
/**
* 找出相交的第一个节点
* @param h1
* @param h2
* @return
*/
public Node getFirstMeetNode(Node h1,Node h2){
if(h1==null||h2==null)
return null;
Node tail1=h1;
int len1=1;
while (tail1.next!=null){
tail1=tail1.next;
len1++;
}
Node tail2=h2;
int len2=1;
while(tail2.next!=null){
tail2=tail2.next;
len2++;
}
if(tail1!=tail2){
return null;
}
Node t1=h1;
Node t2=h2;
//找出较长的链表先遍历
if(len1>len2){
int d=len1-len2;
while(d!=0){
t1=t1.next;
d--;
}
}
if(len1<len2){
int d=len2-len1;
while(d!=0){
t2=t2.next;
d--;
}
}
while(t1!=t2){
t1=t1.next;
t2=t2.next;
}
return t1;
}
public static void main(String[] args) {
MyLinkedList list=new MyLinkedList();
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# Java
# 单链表
# Java实现单链表反转的多种方法总结
# Java如何实现单链表的增删改查
# Java单链表反转图文教程
# java实现简单单链表
# 用JAVA实现单链表
# 检测字符串是否是回文串
# Java单链表的简单操作实现教程
# Java 8实现任意参数的单链表
# Java 单链表数据结构的增删改查教程
# java实现单链表增删改查的实例代码详解
# Java数据结构之简单链表的定义与实现方法示例
# java 数据结构单链表的实现
# Java实现单链表翻转实例代码
# java 实现单链表逆转详解及实例代码
# Java单链表的实现代码
# Java数据结构之单链表详解
# 链表
# 遍历
# 第一个
# 种方法
# 递归
# 为空
# 情况下
# 可以通过
# 使其
# 过得
# 主要内容
# 很明显
# 则可
# 较长
# 过程中
# 走一步
# 如何判断
# 走两步
# tmp
# printList
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何在IIS7中新建站点?详细步骤解析
高性价比服务器租赁——企业级配置与24小时运维服务
Laravel模型事件有哪些_Laravel Model Event生命周期详解
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
php485函数参数是什么意思_php485各参数详细说明【介绍】
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
如何基于云服务器快速搭建网站及云盘系统?
如何生成腾讯云建站专用兑换码?
如何在IIS中新建站点并解决端口绑定冲突?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Java垃圾回收器的方法和原理总结
如何用花生壳三步快速搭建专属网站?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何在自有机房高效搭建专业网站?
JS实现鼠标移上去显示图片或微信二维码
实例解析angularjs的filter过滤器
Firefox Developer Edition开发者版本入口
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
JavaScript如何操作视频_媒体API怎么控制播放
Laravel如何为API编写文档_Laravel API文档生成与维护方法
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
如何在Ubuntu系统下快速搭建WordPress个人网站?
Laravel怎么实现验证码(Captcha)功能
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
nodejs redis 发布订阅机制封装实现方法及实例代码
Laravel如何使用Collections进行数据处理?(实用方法示例)
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
再谈Python中的字符串与字符编码(推荐)
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
如何在Windows服务器上快速搭建网站?
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
Laravel怎么使用Intervention Image库处理图片上传和缩放
北京网站制作的公司有哪些,北京白云观官方网站?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
Laravel怎么为数据库表字段添加索引以优化查询
Laravel如何配置任务调度?(Cron Job示例)
怎么用AI帮你为初创公司进行市场定位分析?
Android自定义控件实现温度旋转按钮效果
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤

