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;
    }

 

posted @ 2021-04-23 08:10  机智的小哥哥  阅读(51)  评论(0编辑  收藏  举报