Java实现单链表的逆序

单链表反转思路

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='第一名'}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值