• 剑指 Offer 24. 反转链表【链表】


    难度等级:简单

     上一篇算法:

    剑指 Offer 06. 从尾到头打印链表【链表】

    力扣此题地址:

    剑指 Offer 24. 反转链表 - 力扣(LeetCode)

    1.题目:反转链表

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

    2.解题思路:

    两种方式:1.迭代法实现    2.递归方式实现(比较难懂)

    1.迭代法实现:

    也就相当于把指针的方向反转,之前是从前往后指,现在从后往前指。 

    2.递归方式实现(比较难懂)

    思路:递归反转就是从原链表的第一个存储节点开始,依次递归调用反转每一个结点,
    //     直到把最后一个反转完毕,真个链表就反转完毕了。

    3.代码实现:

    1.迭代法实现:

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. public ListNode reverseList(ListNode head) {
    13. ListNode pre = null;//定义一个前指针,另后面的结点依次指向当前结点的前一个结点
    14. ListNode cur = head;//定义一个cur指针用于遍历当前链表结点
    15. ListNode next = null;//next指针指向cur的下一个结点
    16. while(cur != null){
    17. next = cur.next;//这里将cur.next赋值给next,方便后面cur的遍历,不然cur.next被赋值pre,值就变了。
    18. cur.next = pre;//将cur的next指针指向pre,如果cur是head话,就指向null。
    19. pre = cur;//令pre指针指向cur结点,这样cur的下一个结点指向pre的时候就相当于指向cur
    20. cur = next;//移动cur到cur的下一个结点
    21. }
    22. return pre;
    23. }
    24. }

    2.递归方式:

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode(int x) { val = x; }
    7. * }
    8. */
    9. class Solution {
    10. public ListNode reverseList(ListNode head) {
    11. // 寻找递归终止条件
    12. // 1、head 指向的结点为 null
    13. // 2、head 指向的结点的下一个结点为 null
    14. // 在这两种情况下,反转之后的结果还是它自己本身
    15. if( head == null || head.next == null) return head;
    16. // 不断的通过递归调用,直到无法递归下去,递归的最小粒度是在最后一个节点
    17. // 因为到最后一个节点的时候,由于当前节点 head 的 next 节点是空,所以会直接返回 head
    18. ListNode cur = reverseList(head.next);
    19. // 比如原链表为 1 --> 2 --> 3 --> 4 --> 5
    20. // 第一次执行下面代码的时候,head 为 4,那么 head.next = 5
    21. // 那么 head.next.next 就是 5.next ,意思就是去设置 5 的下一个节点
    22. // 等号右侧为 head,意思就是设置 5 的下一个节点是 4
    23. // 这里出现了两个 next
    24. // 第一个 next 是「获取」 head 的下一节点
    25. // 第二个 next 是「设置」 当前节点的下一节点为等号右侧的值
    26. head.next.next = head;
    27. // head 原来的下一节点指向自己,所以 head 自己本身就不能再指向原来的下一节点了
    28. // 否则会发生无限循环
    29. head.next = null;
    30. // 我们把每次反转后的结果传递给上一层
    31. return cur;
    32. }
    33. }

    参考单链表里的反转链表(1.用反转头实现 2.用递归实现):

    单链表的基本操作

  • 相关阅读:
    2源码安装网络协议
    shiro授权-SSM
    高性能面试八股文之编译流程&程序调度
    .Net Core之选项模式Options使用
    Android12之强弱智能指针sp/wp循环引用死锁问题(一百六十六)
    python 2018全国自学考试第2章 第6题-other人的共识也是共识,等着下班期间重新设计一下简单的题
    在线JSON转EXCEL工具
    nginx windows安装部署,代理转发配置
    Linux Kernel入门到精通系列讲解(QEMU-虚拟化篇) 2.5 Qemu实现RTC设备
    聊聊jedis连接池参数配置
  • 原文地址:https://blog.csdn.net/m0_51697147/article/details/127880831