zoukankan      html  css  js  c++  java
  • LeetCode206翻转链表问题,多解法求解

      本题是关于链表的翻转问题,要求将单链表翻转并返回新的头结点。有下面两种解法。

      1.解法一:单纯的通过迭代更换节点指针,不断向后迭代。代码如下:

    public ListNode reverseList(ListNode head) {
            ListNode pre=null;      
            ListNode curr=head;
            while(curr!=null){
                ListNode nex=curr.next;  //记录后一个节点放置丢失
                curr.next=pre;
                pre=curr;
                curr=nex;
            }
            return pre;
        }

      2.解法二:递归实现。由于递归的方法适合于大量重复的操作过程,链表倒置恰好也是重复实现更换指针的操作,所以适合使用递归。

      -思路:  2.1 首先需要明确递归函数的功能是什么,本题的递归函数的功能是将当前节点与其后继节点的指针倒置,即让后继节点指向当前节点。

          2.2 之后考虑递归出口,显然当当前节点为空或者当前节点的后继节点为空时,已经不需要再倒置了,直接返回该节点即可。

          2.3 写具体的递归函数体时,先不要往后看,只考虑当前节点需要做什么,显然根据2.1中递归函数功能,这里应该实现倒置指针的功能,即只需要 head.next.next=head即可,而且由于更换了指针,head的指针失效了,这里需要更新head的指针,显然应该更新为null。

          2.4 到了最复杂的一步了,就是递归函数怎么包含在递归体中,可以先考虑递归函数的最终返回目标是什么,由于最终返回最后的节点,这里应该是返回最后一次递归函数的返回值,

           由于递归函数是不断向下运行一直到中断的,reverse(head.next)最终返回的肯定是最终的节点,而且为了不丢失节点,显然该部应该在head.next.next=head的前一步进行,所以是先    写递归函数,在写函数体。

         2.5 最终返回上一步得到的最后一个节点即可。代码如下:

    public ListNode reverseList(ListNode head) {
            if(head==null||head.next==null) return head;
            ListNode nex=reverseList(head.next);
            head.next.next=head;
            head.next=null;
            return nex;
        }
  • 相关阅读:
    《架构之美》读后感(二)
    《架构之美》读后感(一)
    《代码大全2》阅读笔记03
    《代码大全2》阅读笔记02
    《代码大全2》阅读笔记01
    学习进度报告(十四)
    软件方法阅读笔记03
    第二讲
    1.26 十讲第一讲
    1.23
  • 原文地址:https://www.cnblogs.com/lzjdsg/p/14692235.html
Copyright © 2011-2022 走看看