Jianzhi Offer 06. リンクされたリストを端から端まで印刷 (Likou)

目次

1: トピック

2: 問題解決のアイデア

最初の方法: 再帰的

コード:

2 番目の方法: スタック

コード:


1: トピック

連結リストの先頭ノードに入り、各ノードの値を末尾から先頭まで順番に返す(配列で返す)。

例 1:

入力: head = [1,3,2]
出力: [2,3,1]

2: 問題解決のアイデア

最初の方法: 再帰的

さらに、返すベクトルを設定します

private:
    vector<int> ret;

[1,3,2] を元のベクトルに追加すると、新しいベクトルの順序は [2,3,1] になります。

したがって、元のベクトルの先頭ポインタが空であるかどうかを判断し、空でない場合は、最後の番号の位置まで逆方向に移動し、新しいベクトルに順方向に押し込みます。

最後に新しいベクトルを返します

if(head)
        {
            reversePrint(head->next);//循环到最后一个数位置
            ret.push_back(head->val);//从最后一个数往前压入新的vector中
        }
        return ret;//返回新的vector

コード:

class Solution {
    private:
    vector<int> ret;
public:
    vector<int> reversePrint(ListNode* head) {
        if(head)
        {
            reversePrint(head->next);
            ret.push_back(head->val);
        }
        return ret;
    }
};

2 番目の方法: スタック

とにかく後ろから前まで全部ですし、スタックを使って格納することもできますが、スタックの一番上から1つずつデータを取得するのは同じではないでしょうか。

スタックと返すベクトルを定義する

private:
    stack<int> ret;
    vector<int> num;

すべてのデータをスタックにプッシュする

if(head)
        {
            ret.push(head->val);
            reversePrint(head->next);
        }

スタック内のすべてのデータを新しいベクトルにポップし、最後に戻ります

 while(!ret.empty())
        {
            num.push_back(ret.top());
            ret.pop();
        }
return num;

コード:

class Solution {
    private:
    stack<int> ret;
    vector<int> num;
public:
    vector<int> reversePrint(ListNode* head) {
        if(head)
        {
            ret.push(head->val);
            reversePrint(head->next);
        }
        while(!ret.empty())
        {
            num.push_back(ret.top());
            ret.pop();
        }
        return num;
    }
};

おすすめ

転載: blog.csdn.net/qq_62718027/article/details/128793673