簡単 0件解決済み 正答率0%

連結リストの操作

連結リストを再現します。両端への追加、先頭や値による削除、逆順への並べ替えを行います。

このチャレンジで学べること

  • 両端でノードを追加・削除する
  • 指定した値の最初のノードを削除する
  • リストの並びを逆にする

問題

原文(英語)を表示

連結リストは値を次のノードを指すノードに保存するので、先頭での追加や削除が速くできます。空の状態から始まるリストを再現してください。

操作を順番に処理します:

  • 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用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。