• 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;
        }
  • 相关阅读:
    ajaxfileupload
    ASP.NET从MVC5升级到MVC6
    jvm(13)-线程安全与锁优化(转)
    成为顶尖自由职业者必备的7个软技能之一:沟通(转)
    在ubuntu安装Phabricator(转)
    查看mysql当前表使用的存储引擎(转)
    在Java中如何使用jdbc连接Sql2008数据库(转)
    漂亮的ActionBar效果
    Android smartimageview网络图片查看器
    Android 图板之保存图像
  • 原文地址:https://www.cnblogs.com/lzjdsg/p/14692235.html
Copyright © 2020-2023  润新知