問題
連結リストは値を次のノードを指すノードに保存するので、先頭での追加や削除が速くできます。空の状態から始まるリストを再現してください。
操作を順番に処理します:
push_front x: x を先頭に追加します。push_back x: x を末尾に追加します。pop_front: 先頭の値を削除します(リストが空なら無視)。remove x: 値が x の最初のノードがあれば削除します。reverse: ノードの並びを逆にします。
linked_list_operations(operations) を実装してください。
入力
operations: 操作の一覧。
出力
リストの値を先頭から末尾の順に返します。
制約
0 ≤ 操作の数 ≤ 10,000
−10^9 ≤ x ≤ 10^9
例
例 1
入力:
operations = ["push_back 2", "push_front 1", "push_back 3", "reverse"]
期待される出力:
expected = [3, 2, 1]
入力:
std::vector<std::string> operations = {"push_back 2", "push_front 1", "push_back 3", "reverse"};
期待される出力:
std::vector<long long> expected = {3, 2, 1};
入力:
string[] operations = new string[] {"push_back 2", "push_front 1", "push_back 3", "reverse"};
期待される出力:
long[] expected = new long[] {3, 2, 1};
解説
リストは 1 → 2 → 3 になり、逆にすると [3, 2, 1] です。
例 2
入力:
operations = ["push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"]
期待される出力:
expected = [5]
入力:
std::vector<std::string> operations = {"push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"};
期待される出力:
std::vector<long long> expected = {5};
入力:
string[] operations = new string[] {"push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"};
期待される出力:
long[] expected = new long[] {5};
解説
remove は最初の 5 だけを取り除くので 7 → 5 が残り、pop_front で 7 が消えます: [5]。
解き方のヒント
まずは自分で考えてから、ヒントを 1 つずつ開いてみましょう。
ヒント 1
前後への追加が速いリスト型(std::list、LinkedList<T>、deque)がほとんどの仕事をしてくれます。
ヒント 2
remove は最初に一致したものだけを消し、空のリストへの pop_front は何もしません。
ヒント 3
逆にすると、その後の push や pop で先頭になる端が入れ替わります。
目安の計算量
時間 O(n²)、追加メモリ O(n)
参考資料
この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。