• LeetCode第206题—反转链表


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

    🌱分析阶段

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

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

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

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

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


    🌱代码阶段

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

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

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

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

    1. class Solution {
    2. public ListNode reverseList(ListNode head) {
    3. if(head==null) return null;
    4. if(head.next==null) return head;
    5. ListNode cur = head.next;
    6. ListNode next = head.next.next;
    7. }
    8. }

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

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

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

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

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

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

    换成代码语言👇:

    1. class Solution {
    2. public ListNode reverseList(ListNode head) {
    3. if(head==null) return null;
    4. if(head.next==null) return head;
    5. ListNode cur = head.next;
    6. ListNode next = head.next.next;
    7. head.next = null;
    8. while(next!=null){
    9. cur.next = head;
    10. head = cur;
    11. cur = next;
    12. next = next.next;
    13. }
    14. cur.next = head;
    15. head = cur;
    16. return head;
    17. }
    18. }

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

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

    nice😎✨


     以上!便是全部的啦😎

    又是收获满满的一天~

  • 相关阅读:
    网安学习-Python安全开发
    MapInfo格式到ArcGIS格式的转换方法
    redis之单线程的redis都有哪些阻塞点
    14:00面试,14:05就出来了,问的问题有点变态。。。
    leetcode刷题 (8.26) 二叉树
    日志管理系统,多种方式总结
    【计算机网络】UDP/TCP协议
    Linux中间件之redis的高可用
    CrossEntropyLoss计算损失的时候可以传3维或者更高维的变量
    SpringCloud - Spring Cloud Alibaba 之 Gateway 集成Sentinel (十一)
  • 原文地址:https://blog.csdn.net/Green_756/article/details/126295976