数据结构之单链表的反转

  1. 分析
    å¨è¿éæå¥å¾çæè¿°
  2. 代码实现
    package com.iamp.admin;
    
    public class Test {
    
        public static void main(String[] args) {
            //先创建几个节点
            HeroNode heroNode1 = new HeroNode(1,"宋江","及时雨");
            HeroNode heroNode2 = new HeroNode(2,"卢俊义","玉麒麟");
            HeroNode heroNode3 = new HeroNode(3,"吴用","智多星");
            HeroNode heroNode4 = new HeroNode(4,"林冲","豹子头");
            //创建链表
            SingleLinkedList singleLinkedList = new SingleLinkedList();
            //加入节点
            singleLinkedList.add(heroNode1);
            singleLinkedList.add(heroNode2);
            singleLinkedList.add(heroNode3);
            singleLinkedList.add(heroNode4);
            //显示链表
            singleLinkedList.show();
            System.out.println("反转=============================");
            reverseList(singleLinkedList.getHead());
            singleLinkedList.show();
        }
    
        //方法:将单链表进行反转
        public static void reverseList(HeroNode head){
            //如果当亲链表为空或者只有一个节点,直接返回
            if(head.next==null ||head.next.next==null){
                return;
            }
            //定义一个辅助变量,遍历原来的链表
            HeroNode cur = head.next;
            HeroNode next = null;//指向当前节点cur的下一个节点
            HeroNode reverseHead = new HeroNode(0,"","");
            //遍历原来的链表,每遍历一个节点,就将其取出,并放在新的节点reverseHead的最前端
            while (cur!=null){
                next = cur.next;//先暂时保存当前节点的下一个节点,下面要使用
                cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
                reverseHead.next=cur;//将cur连接到新的链表上
                cur = next;//让cur后移
            }
            //将head.next指向reverseHead.next ,实现单量表的反转
            head.next = reverseHead.next;
        }
    
    
    }
    
    class HeroNode{
        public int no;
        public String name;
        public String nickName;
        public HeroNode next;//指向下一个节点
    
        //构造器
        public HeroNode(int no,String name,String nickName){
            this.no = no;
            this.nickName = nickName;
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "HeroNode{" +
                    "no=" + no +
                    ", name='" + name + '\'' +
                    ", nickName='" + nickName + '\'' +
                    '}';
        }
    }
    
    class SingleLinkedList{
        //创建一个头节点
        private HeroNode head = new HeroNode(0,"","");
    
        public HeroNode getHead() {
            return head;
        }
    
        //添加节点到单向链表
        public void add(HeroNode heroNode){
            //定义一个辅助变量指向头结点
            HeroNode temp = head;
            while (true){
                //如果找到了节点的最后就跳出循环
                if(temp.next == null){
                    break;
                }
                //如果没有找到节点最后,就让temp后移
                temp = temp.next;
            }
            //当退出while循环时,temp就指向了链表的最后
            //将最后这个节点的next指向新的节点
            temp.next = heroNode;
        }
    
        //显示链表
        public void show(){
            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;
            }
        }
    }
    
    
    
    

  3. 主要代码分析
    //方法:将单链表进行反转
        public static void reverseList(HeroNode head){
            //如果当亲链表为空或者只有一个节点,直接返回
            if(head.next==null ||head.next.next==null){
                return;
            }
            //定义一个辅助变量,遍历原来的链表
            HeroNode cur = head.next;
            HeroNode next = null;//指向当前节点cur的下一个节点
            HeroNode reverseHead = new HeroNode(0,"","");
            //遍历原来的链表,每遍历一个节点,就将其取出,并放在新的节点reverseHead的最前端
            while (cur!=null){
                next = cur.next;//先暂时保存当前节点的下一个节点,下面要使用
                cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
                reverseHead.next=cur;//将cur连接到新的链表上
                cur = next;//让cur后移
            }
            //将head.next指向reverseHead.next ,实现单量表的反转
            head.next = reverseHead.next;
        }

    1)初始化需要反转的链表数据
         head->宋江->卢俊义->吴用->林冲
    2)进入反转的方法中第一次while各个变量的值
          cur:
              宋江->卢俊义->吴用->林冲
          reverseHead:
              head->宋江->null
           
    3)进入反转的方法中第二次while各个变量的值
          cur:
               卢俊义->吴用->林冲
          分析:
               a: next = cur.next;//先暂时保存当前节点的下一个节点,下面要使用
                   next等于:吴用->林冲
               b: cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
                   reverseHead.next等于:宋江->null
                   cur.next等于: 宋江->null
                   所以cur等于:卢俊义->宋江->null
               c:reverseHead.next=cur;//将cur连接到新的链表上 
                    reverseHead等于:head->卢俊义->宋江->null
               d:cur = next;//让cur后移,最后将之前保存的next赋值给cur重新循环-->
                     cur等于:吴用->林冲
          结果reverseHead:
               head->卢俊义->宋江->null  

    4)  进入反转的方法中第3次while各个变量的值
         cur:
              吴用->林冲
         分析同理......
         reverseHead:
              head->吴用->卢俊义->宋江->null
    .........
    最后:
         reverseHead:
              head->林冲->吴用->卢俊义->宋江

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值