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