zoukankan      html  css  js  c++  java
  • LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)

    翻译

    反转一个单链表。

    原文

    Reverse a singly linked list.

    分析

    我在草纸上以1,2,3,4为例。将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面精致):

    这里写图片描写叙述

    有了这个图(每次把博客发出去后就会发现图怎么变得这么小了哎!仅仅能麻烦大家放大看或者另存为了。这图命名是1400X600的)。那么代码也就自然而然的出来了:

    ListNode* reverseList(ListNode* head) {
        ListNode* newHead = NULL;
        while (head) {
            ListNode* nextNode = head->next;
            head->next = newHead;
            newHead = head;
            head = nextNode;
        }
        return newHead;
    }

    上面用的是递归。以下就接着来看看怎样把递归改写成迭代。

    他们的共同点无非就是都有值在不停的进行变换更迭,大家回想一下上图会发现就是这里的headnewHead。所以接下来就把这两个值作为迭代循环的參数。

    递归转迭代

    第一步:先写出迭代的模板。以及设定好的參数。

    ListNode* reverseListIter(ListNode* head, ListNode* newHead) {
    
    }
    
    ListNode* reverseList(ListNode* head) {
    
    }

    第二步:为第一次迭代设定初始值。假设已经遗忘了的话,请看上面的递归代码,newHead一開始是等于NULL的,所以添加代码例如以下。

    ListNode* reverseListIter(ListNode* head, ListNode* newHead) {
    
    }
    
    ListNode* reverseList(ListNode* head) {
        return reverseListIter(head, NULL);
    }

    第三步:上面的一二步能够说是通用的。但从第三步開始就要依据特定的递归过程来改写了。

    首先是推断迭代停止的条件,上面递归过程中停止的条件是head为空。这里照搬。

    ListNode* reverseListIter(ListNode* head, ListNode* newHead) {
        if (head == NULL) return newHead;
    }

    紧接着递归中有两个初始的赋值,这里也一并复制过来:

    ListNode* reverseListIter(ListNode* head, ListNode* newHead) {
        if (head == NULL) return newHead;
        ListNode* nextNode = head->next;
        head->next = newHead;
        return reverseListIter(head, newHead);
    }

    第四步:更新迭代的參数。能够看到递归代码更新方式例如以下:

    newHead = head;
    head = nextNode;

    你当然也能够直接这样写到迭代中,但既然用了參数,何不把这过程在代码形式上简化一下呢?

    ListNode* reverseListIter(ListNode* head, ListNode* newHead) {
        if (head == NULL) return newHead;
        ListNode* nextNode = head->next;
        head->next = newHead;
        return reverseListIter(nextNode, head);
    }

    那么这样就完毕了整个迭代的过程了,棒!

    有两个地方须要注意一下:

    1,一定要记得return2,第一行推断后。返回的是newHead。
    这是由于当newHead为空时,返回newHead也是返回空;
    当newHead不为空时,其则要作为结果返回给reverseList函数。

    事实上把改写的过程拆解来看是很easy理解的,希望我的博客能够帮到大家……

    代码

    /**
    * Definition for singly-linked list.
    * struct ListNode {
    *     int val;
    *     ListNode *next;
    *     ListNode(int x) : val(x), next(NULL) {}
    * };
    */
    class Solution {
    public:
        ListNode* reverseListIter(ListNode* head, ListNode* newHead) {
            if (head == NULL) return newHead;
            ListNode* nextNode = head->next;
            head->next = newHead;
            return reverseListIter(nextNode, head);
        }
    
        ListNode* reverseList(ListNode* head) {
            return reverseListIter(head, NULL);
        }
    };
  • 相关阅读:
    Hadoop集群(三) Hbase搭建
    Hadoop集群(二) HDFS搭建
    Hadoop集群(一) Zookeeper搭建
    Redis Cluster 添加/删除 完整折腾步骤
    Redis Cluster在线迁移
    Hadoop分布式HA的安装部署
    Describe the difference between repeater, bridge and router.
    what is the “handover” and "soft handover" in mobile communication system?
    The main roles of LTE eNodeB.
    The architecture of LTE network.
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7230635.html
Copyright © 2011-2022 走看看