ディレクトリ
問題の説明
説明タイトルを
入力リンクリスト、ArrayListの頭から尾の順序に従ってリストを返します。
必要な
制限時間:1秒
スペースの制約:32768K
メソッドのプロトタイプ
public ArrayList<Integer> printListFromTailToHead(ListNode listNode)
public class ListNode {
int val;
ListNode next = null;
}
問題解決のためのアイデア
それは二重リストをリンクされている場合は、このトピックでは、尾から直接行き来することができますイテレータを取得するには、単純すぎるだろう。しかし、それは、この問題がされて与えられたプロトタイプメソッドプロトタイプListNodeから見ることができ、単独リンクリスト。
デフォルトのリストには、道を始めから終わりまで、対象の要件を横切ることができる尾から頭に反対の要件に。それではこの質問への鍵になるトラバース道を逆にするか、それが自然に使って考えるだろう、最後のアウトスタック構造を。
具体的には、次のことができます。
- 余分のスタックを準備
- 最初から最後まで単独リンクリストトラバーサルのための
- リンクリストのノード、スタック上のリストのノードを通過しません
- スタックが空になるまで横断リスト後、順次スタック要素を削除して印刷
次の図は、移動にこのプロセスを示しています。
上記の溶液中でのみスタックことが注目される論理的な概念を実際のプログラミングは、リスト、配列とそれを置き換えることができ、。
関連するコード
JAVAのバージョン
STLは、JavaやC ++標準パッケージの準備ができてスタックデータ構造を持っているので、我々は直接のjavaを達成するために、次のコードを使用することができます。
package com.shellmad;
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack = new Stack<>();
ArrayList<Integer> result = new ArrayList<>();
// 遍历链表,入栈
while (listNode != null) {
stack.push(listNode.val);
listNode = listNode.next;
}
// 出栈
while (stack.size() != 0) {
result.add(stack.pop());
}
return result;
}
}
class ListNode {
public int val;
public ListNode next = null;
}
C ++バージョン
以下は、C ++の実装です:
#include <vector>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
static vector<int> printListFromTailToHead(ListNode* head)
{
vector<int> ArrayList;
ListNode* pCur = head;
ListNode* pTail = NULL;
while (head != pTail)
{
pCur = head;
while (pCur->next != pTail)
{
pCur = pCur->next;
}
ArrayList.push_back(pCur->val);
pTail = pCur;
}
return ArrayList;
}
};