LeetCode第206题—反转链表

本次写的题目是反转链表,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎

🌱分析阶段

首先第一眼看到题目,我们要做到的是把这个链表翻转,在做数据结构题目的时候,我们重要的解题手段之一就是画图❗❗ 所以下面先做出一个图来康康👇

要改变链表的顺序,就是要改变节点的链接,也就是改变各节点上的next域, 先创建两个节点(cur,next)来试一下可不可以将这个链表翻转👇

在经过尝试之后我们发现,仅仅用两个节点来将链表翻转是做不到的,因为我们只用两个节点,一个用于记录当前要改的节点,一个用于记录前一个位置的节点,那么就差了一个节点记录之后的位置。当我们把当前位置的节点链接上一个节点之后,就与原本链表中的下一位置的节点断连了❌

那么如果尝试用三个节点嘞?一个用于记录前一节点(就用head代替),一个用于记录当前节点(cur),一个用于记录下一节点(next)画图试一下👇

大成功!😎可行,说明我们分析的使用三个节点是莫得问题的,那么就正式进入到代码阶段。


🌱代码阶段

每次写代码都不要忘记特殊情况,由于用到了三个节点,且其中两个节点一个在第二个节点上,另一个节点在第三个节点上,所以要提前分析下面两种情况,以免出现空指针异常的情况:①头指针为null;②头指针的next为null;

针对上面两种情况,我们可以用下面代码解决:

if(head==null) return null;    //当头指针为null,我们直接返回null
if(head.next==null) return head;    //当头指针的next为null,即整个链表只有一个节点的时候,直接返回该头结点

在确认头节点以及第二个节点存在后,我们才能够创建cur与next节点,用于记录当前节点和下一位置节点。

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null) return null;
        if(head.next==null) return head;
        ListNode cur = head.next;
        ListNode next = head.next.next;
    }
}

之后就是真正的反转链表环节,然而我们要反转链表,就需要使用到while语句来遍历整个数组,那么限定条件是什么🧐:

再通过用图演示一遍后发现,当next节点为null的时候,我们就可以停止了,然后单独对最后剩下的两个节点进行翻转,就可以完成整条链表的翻转了。这里博主就不另外作图解释了,各位老师们可以自己试一下自己作图演示,会更加加深记忆与理解的😎

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

翻转阶段按照下面的话进行编写代码就可以了(其实也是上面的演示动图中的话)👇

cur用于记录当前节点,来链接上一个节点达到翻转目的,翻转完之后head就到cur的位置上,cur再跑去下一个节点的位置上(即next节点的位置上),然后记录下一个位置节点的next节点进行往下一个节点跑

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

换成代码语言👇:

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null) return null;
        if(head.next==null) return head;
        ListNode cur = head.next;
        ListNode next = head.next.next;
        head.next = null;
        while(next!=null){
            cur.next = head;
            head = cur;
            cur = next;
            next = next.next;
        }
        cur.next = head;
        head = cur;
        return head;
    }
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

至此,代码算是完成啦😎跑来逝逝吧😎

nice😎✨


 以上!便是全部的啦😎

又是收获满满的一天~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值