zoukankan      html  css  js  c++  java
  • 206. 反转链表

    代码示例分析

    1 /**
     2  * 单链表反转
     3  * [1,2,3,4] -> [4,3,2,1]
     4  * @author liaowenhui
     5  * @date 2021/6/20 16:28
     6  */
     7 public class testReverseList {
     8     
     9     /**
    10      * 方法2 递归反转
    11      * 公式含义:把拿到的链表进行反转,然后返回新的头结点。
    12      *
    13      * @param head
    14      * @return
    15      */
    16     public static ListNode reverseList(ListNode head) {
    17             //结束条件
    18             if (head == null || head.next == null) {
    19                 return head;
    20             }
    21             ListNode newHead = reverseList(head.next);
    22             //假设来到递归的最后一步我们已经把 2->3 递归成 3->2,1这个节点还没有去碰它,所以 1 的 next 节点仍然是2,1没有上一个节点。
    23             // 让2的next指向 1
    24             head.next.next = head;
    25             // 1的next指向null.
    26             head.next = null;
    27             //返回把调整之后的链表
    28             return newHead;
    29     }
    30 
    31 
    32     /**
    33      *  方法1 迭代
    34      *  1->2->3->null
    35      * 第一步 1->null  2->3->null
    36      * 第二步 2->1->null 3->null
    37      * 第三步 3->2->1->null
    38      * 最终 3->2->1->null
    39      * @param head
    40      * @return
    41      */
    42     public static ListNode reverseList2(ListNode head) {
    43         //上一个节点
    44         ListNode prev = null;
    45         //当前节点
    46         ListNode curr = head;
    47         while (curr != null) {
    48             //原先1的下一个节点是2 原先2的下一个节点是3 原先3的下一个节点是null
    49             ListNode next = curr.next;
    50 
    51             //把1的下一个节点置为null  把2的下一个节点置为1 把3的下一个节点置为2
    52             curr.next = prev;
    53 
    54             /**
    55              * 把当前节点设置为上一个节点
    56              * 1为上一个节点 2为上一个节点 3为上一个节点
    57              */
    58             prev = curr;
    59 
    60             /**
    61              * 把原先的下一个节点设置为当前节点
    62              * 2为当前节点 3为当前节点 null为下一个节点
    63              */
    64             curr = next;
    65         }
    66         return prev;
    67     }
    68     
    69     public static void main(String[] args) {
    70         //初始化
    71         ListNode head = new ListNode(1);
    72         ListNode node1 = new ListNode(2);
    73         ListNode node2 = new ListNode(3);
    74         ListNode node3 = new ListNode(4);
    75         head.setNext(node1);
    76         node1.setNext(node2);
    77         node2.setNext(node3);
    78 
    79         //方法1 迭代
    80         //ListNode listNode = reverseList2(head);
    81         //方法2 递归反转
    82         ListNode listNode = reverseList(head);
    83 
    84         //打印
    85         while (null != listNode) {
    86             System.out.print(listNode.getDate() + " ");
    87             listNode = listNode.getNext();
    88         }
    89     }
    90 
    91 }

    递归理解

    递归解题首先要做的是明确递推公式的含义,在这里对于结点1来说,它只需要知道它之后的所有节点反转之后的结果就可以了,也就是说递推公式reverseList的含义是:把拿到的链表进行反转,然后返回新的头结点。

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    插件有感-做东西有感
    国家电网-元数据管理系统-流程跳转有感-3层结构
    干了2个月java开发最深的体会
    BL老师的建议,数学不好的,大数据一票否决--后赋从java转大数据
    极快瑞的函数式编程,Jquery涉及的一些函数
    距离第一天去实习过去了56天 ::写写自己的想法
    两种同步模式:状态同步和帧同步
    unity制作人物残影-绘制的方法
    unity对敏感词库处理的记录
    unity 读取外部exe程序控制台信息
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/14926243.html
Copyright © 2011-2022 走看看