单链表反转思路
1、先定义一个节点reverseHead=new HeroHead();
2、从头到尾遍历原来的链表,并将每一个节点取出放在新的链表 的reverseHead的最前端
3、让头节点指向 head.next=reversehead.next
package com.dmj.admincommon.util;
/**
* 定义一个节点类
*/
public class SingleListDemo {
public static void main(String[] args) {
HeroNode heroNode=new HeroNode(1,"张三","第一名");
HeroNode heroNode1=new HeroNode(2,"李四","第二名");
HeroNode heroNode2=new HeroNode(3,"王五","第三名");
SingleList singleList=new SingleList();
singleList.add(heroNode);
singleList.add(heroNode1);
singleList.add(heroNode2);
System.out.println("反转前列表为");
singleList.list();
System.out.println("反转后列表为");
singleList.reverse(singleList.getHead());
singleList.list();
}
}
class SingleList {
private HeroNode head=new HeroNode(0,"","");
/**
* 添加单链表的节点
* @param heroNode
*/
public void add(HeroNode heroNode) {
//将辅助变量指向头节点
HeroNode temp=head;
//遍历到链表的最后
while (true) {
if (temp.next==null) {
//查找到最后节点则指向新添加的节点
temp.next=heroNode;
break;
}
//没找到最后的节点则继续遍历
temp=temp.next;
}
}
public void list() {
if (head.next==null) {
System.out.println("链表为空");
return;
}
//定义一个辅助变量,头节点不保存数据
HeroNode temp=head.next;
while (true) {
//遍历到最后一个数据则跳出循环
if (temp ==null) {
break;
}
System.out.println(temp);
//不停的进行遍历
temp=temp.next;
}
}
public HeroNode getHead() {
return head;
}
/**
* 链表逆序方法
*/
public void reverse(HeroNode head) {
//如果当前链表为空或者只有一个节点,无需反转
if (head.next==null || head.next.next==null) {
System.out.println("当前链表为空,无需反转");
}
HeroNode cur=head.next; //定义当前节点
HeroNode next=null; //定义当前节点的下一个节点
HeroNode reverseHead=new HeroNode(0,"","");
while (cur !=null) {
next=cur.next; //下一个节点进行赋值
cur.next=reverseHead.next; //将当前节点指向reverseHead
reverseHead.next=cur; //将reverseHead下一个节点指向cur
cur=next; //进行遍历
}
//最后在将head指向reverseHead
head.next=reverseHead.next;
}
}
class HeroNode {
private int no;
private String name;
private String nickName;
/**
* 定义下一个节点
*/
public HeroNode next;
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
显示结果:
反转前列表为
HeroNode{no=1, name='张三', nickName='第一名'}
HeroNode{no=2, name='李四', nickName='第二名'}
HeroNode{no=3, name='王五', nickName='第三名'}
反转后列表为
HeroNode{no=3, name='王五', nickName='第三名'}
HeroNode{no=2, name='李四', nickName='第二名'}
HeroNode{no=1, name='张三', nickName='第一名'}