Java 反转带头结点的单链表并显示输出的实现过程
作者:吉吉女王 发布时间:2022-06-08 18:34:39
标签:Java,反转,带头结点,单链表
注意:要保证已经有Node类和单链表的初始化,这样才能调用反转方法并显示结果。
方法如下:
//Node<T>指泛型结点类
public void reverse2(Node<T> head){
Node<T> p=head.next;
Node<T> q=head.next.next;
head.next=null;
p.next=null;
while(q!=null){
Node<T> temp=q.next;
q.next=p;
p=q;
q=temp;
}
q=this.head;
q.next=p;
/*
//想要直接在方法中遍历输出可以使用这段代码 ***p是反转后的第一个结点***
for(Node<T> qq=p;qq!=null;qq=qq.next){//qq不能为q,因为结束循环后,p是最后一个结点,q是null
System.out.print(qq.data+"\t");
}
*/
}
实现过程如图所示:
在循环之前,先把head以及初始p的next断掉,方便后面的循环;循环中的q.next=p就是重定向,这一步把原来的next指向p;
不用q=q.next来使q向后移动,因为q结点的指针重指向后,q的next为空了,无法正确指向下一个结点。这时用temp结点来做一下过渡,在q指针重指向之前,把q的下一个结点赋给temp,即temp=q.next,在重指向后,用q=temp来向后移动;
p=q;q=temp就是往后移动一个结点,可以继续重复循环。
循环结束时,q为空,p为最后一个结点,使q作为头结点并指向p就完成了反转。
整体代码:
Node类:
public class Node<T>{
public T data;
public Node<T>next;
public Node(T data,Node<T>next){
this.data=data;
this.next=next;
}
public Node(){
this(null,null);
}
public String toString(){
return this.data.toString();
}
}
单链表类:
public class SinglyList<T> {
public Node<T> head;
public SinglyList(){
this.head=new Node<T>();
}
public SinglyList(T[] values){
this();
Node<T> rear=this.head;
for(int i=0;i<values.length;i++)
{
rear.next=new Node<T>(values[i],null);
rear=rear.next;
}
}
//输出方法
public String toString(){
String str=this.getClass().getName()+"(";
for(Node<T>p=this.head.next;p!=null;p=p.next)
{
str+=p.data.toString();
if(p.next!=null)
str+=",";
}
return str+=")";
}
//反转方法
public void reverse2(Node<T> head){
Node<T> p=head.next;
Node<T> q=head.next.next;
head.next=null;
p.next=null;
while(q!=null){
Node<T> temp=q.next;
q.next=p;
p=q;
q=temp;
}
q=this.head;
q.next=p;
/*
//想要直接在方法中遍历输出可以使用这段代码 ***p是反转后的第一个结点***
for(Node<T> qq=p;qq!=null;qq=qq.next){//qq不能为q,因为结束循环后,p是最后一个结点,q是null
System.out.print(qq.data+"\t");
}
*/
}
public static void main(String[] args) {
Integer[] a={1,2,4,5,7};
SinglyList<Integer> sl=new SinglyList<>(a);
System.out.println(sl.toString());
sl.reverse2(sl.head);
System.out.println(sl.toString());
}
}
输出结果:
来源:https://blog.csdn.net/m0_57414485/article/details/121265470
0
投稿
猜你喜欢
- 如果你发现在一个接口使用有如下定义方法: public String[] getParameters();那么你应该认
- 1.流布局FlowLayout所有组件像流一样,一个一个排放,排满了一行之后排下一行,默认情况下,每个组件是居中排列的,但是也可以设置。流布
- 返回值类型:System.Int64表示为 Windows 文件时间的当前 DateTime 对象的值。例如:DateTime.Now.To
- java语言是一种面向对象的程序设计语言吗java语言是面向对象的程序设计语言支持部分或绝大部分面向对象特性(类和实例、封装性、继承、多态)
- 序列化与反序列化Java对象是有生命周期的,当生命周期结束它就会被回收,但是可以通过将其转换为字节序列永久保存下来或者通过网络传输给另一方。
- 异常与错误:异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通
- 在javaweb中写了一个图片的链接,可以打开预览,另外提供一个下载功能。以下是预览代码,没什么好说的;href若连接的是一个压缩包文件之类
- 问题是这样的在开发时,为了节约时间,我选择了mybatis框架来开发,然后又在网上找了一个许多人都推荐的mybatis-plus来作为持久层
- mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默
- 前两天看了个扫雷的视频,于是自己跟着做了下,感觉还不是很难。初学Java的同学可以尝试自己操作下Java小程序这样子才能提高自己的理解能力和
- springboot配置templates直接访问springboot下的templates目录的资源默认是受保护的,类似于javaweb项
- springmvc 中的 * 可以对请求进行判别, 在请求到达控制器之前, 把非法的请求给拦截掉下面来说一说, 它在springboot中的
- 在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time、update_time、update
- 相信大家在小的时候都玩过拼图游戏,现如今,手机普及,能在手机上玩的游戏越来越多,于是乎,重温小时候,编写这个简易拼图游戏,而且也能进一步加深
- // 举个例子:一个网站有用户系统、商家系统、网站后台3个系统//可以分3个userType, user ,shop , system//网
- 这一篇写一下springboot整合solr,代码已经上传到github,传送门。1、新建core并配置schemasolr create
- 一 模式介绍重试模式,是应用在异常处理中,发生异常的时候,能够对业务程序进行重新调用,在实际中,可以使用Polly提供稳定,简单的用法,自己
- SpringBoot后台如何实现文件上传下载?最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的
- 文件输出为字符串示例代码:/** * 读取文件为字符串 * * @return */pub
- 这篇文章主要介绍了Java解析json报文实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可