算法题(Java):将链表反转并输出——菜鸟详解

题目描述:
如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

示例1
输入:
{1,2,3}
复制
返回值:
{3,2,1} 

分析
1、Java的单链表怎么创建

class ListNode {
    int val;
    ListNode next;
    ListNode(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }

2、添加数据并链接

   ListNode l1 = new ListNode(1);
   ListNode l2 = new ListNode(2);
   ListNode l3 = new ListNode(3);
   //设计链表链接方式1-->2-->3
   l1.next=l2;
   l2.next=l3;
   l3.next=null;

3、反转核心代码逻辑

    public ListNode ReverseList(ListNode head) {
        //处理空链表
        if(head == null)
            return null;   
        ListNode cur = head;
        ListNode pre = null;
        while(cur != null){
  
            ListNode temp = cur.next;//目的:跳出循环

            cur.next = pre;//目的:替换next的数据
            
            pre = cur;//目的:链接新表
            
            cur = temp;
        }
        return pre;
    }
}

分析
第一轮cur=1,2,3 pre=null,所以cur.next都被null替换,此时cur就只保留了第一个数据即cur=1 赋值给pre=1
第二轮cur被temp赋值为cur=2 pre=1,所以cur.next=1,那么pre=2,1
第三轮cur被temp赋值为cur=3 pre=2,1 所以cur.next=2,1,那么pre=3,2,1

完整代码及推导

/**
 * Created by KingsLanding on 2022/9/12 11:34
 */
public class demo01 {
    public ListNode ReverseList(ListNode head) {
        //处理空链表
        if(head == null)
            return null;
        ListNode cur = head;
        ListNode pre = null;
        while(cur != null){
            //将链表断开,让链表逐次变短后移,直到最后为null,跳出循环
            /*
            此时的temp=cur.next“这个”数据,比如第一轮temp=2,
            第二轮temp=3,第三轮temp=null跳出循环
             */
            ListNode temp = cur.next;//目的:跳出循环

            //当前的next指向前一个;意味着cur之后的即cur.next链接的数据被此时的pre替换
            /*
            第一轮cur=1,2,3    pre=null,所以cur.next都被null替换此时cur就只保留了第一个数据即cur=1 赋值给pre=1、
            第二轮cur被temp赋值为cur=2  pre=1,所以cur.next=1,那么pre=2,1
            第三轮cur被temp赋值为cur=3 pre=2,1 所以cur.next=2,1,那么pre=3,2,1
             */
            cur.next = pre;//目的:替换next的数据

            //前一个更新为当前
            pre = cur;//目的:链接的新表
            
            //当前更新为刚刚记录的后一个
            //因为cur.next = pre;所以需要在此将cur的值还原
            cur = temp;
        }
        return pre;
    }
}

class ListNode {
    int val;
    ListNode next;
    ListNode(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }

    public static void main(String[] args) {
        demo01 demo01 = new demo01();
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(2);
        ListNode l3 = new ListNode(3);
        //设计链表链接方式1-->2-->3
        l1.next=l2;
        l2.next=l3;
        l3.next=null;
        //返回的链表3-->2-->1
        ListNode listNode1 = demo01.ReverseList(l1);
        while (listNode1!=null){
            System.out.println(listNode1.val+"");
            listNode1=listNode1.next;
        }
    }
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

King'sLanding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值