間を あけた 2 本の 指で 連結リストの 後ろから n 番目の節を外す
連結リストの
海外で定番の問題リスト 4 本には入っていません
問題
連結リストのhead とn をn 番目の
- 後ろから 1 番目は
最後の節です nは 1 以上、節の 数以下です - 各節は
val(値) とnext(次の節) を 持ちます。 最後の 節の nextは、Python では None、JavaScript では null、Go では nilです。Go の 節は ListNodeで、Val、Nextと大文字で 始まります - 先頭の
節を 外すこともあります。 節が 1 つで、 それを 外すと 空の リストになります - 節の
数は 1 以上 30 以下、 値は どれも 0 以上 100 以下です - リストを 1 回なめるだけで
解いてください
例では、
入力と出力の例
例 1
待ち行列の
例 2
後ろから 3 番目は、
例 3
節が 1 つだけで、
面接での聞かれ方
連結リストの 2 本の
- 「連結リストの
後ろから n 番目の 節を 消してください」 - 長さを
数えてから 前から 探す 2 回なめる 書き方を 答えると、 「1 回で 済ませられますか?」と 聞かれます - 「先頭の
節を 消すときは どうなりますか?」と、 端の 場合を 確かめられます
ミドルの
ヒント
まだ開いていません
付箋は 4 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3
ヒント 4答えに近い
アルゴリズムのチートシートの「配列と文字列」に、
関わる学び
配列と
まず 考える手順
段 1
まずは
段 2
外す節の 1 つ前のnext を 1 つ飛ばすだけでn だけn 個手前、
段 3
先頭をdummy をdummy からdummy.next を
段 4
前のn 歩進め、next を next.next に
解答
Python
Python
def remove_nth_from_end(
head, n
):
dummy = ListNode(0, head)
front = back = dummy
for _ in range(n):
front = front.next
while front.next:
front = front.next
back = back.next
back.next = back.next.next
return dummy.nextJavaScript
JavaScript
function removeNthFromEnd(
head, n
) {
const dummy = new ListNode(
0, head
);
let front = dummy;
let back = dummy;
for (let i = 0; i < n; i++) {
front = front.next;
}
while (front.next !== null) {
front = front.next;
back = back.next;
}
back.next = back.next.next;
return dummy.next;
}Go
Go
func removeNthFromEnd(
head *ListNode, n int,
) *ListNode {
dummy := &ListNode{Next: head}
front, back := dummy, dummy
for i := 0; i < n; i++ {
front = front.Next
}
for front.Next != nil {
front = front.Next
back = back.Next
}
back.Next = back.Next.Next
return dummy.Next
}front と back のn 歩です。front がback のn 番目の節です。
計算量
- 時間は O(L) です。
L は 節の 数で、 前の 指が リストを 1 回なめるだけです - 使う
記憶は O(1) です。 ダミーの 節 1 つと 指 2 本だけです
よく ある間違い
- ダミーを
置かずに 先頭から出す。 例 2 のように 先頭を 外すとき、 外す節の 1 つ前が ありません。 場合分けを 忘れると、 前の 指が n歩進めずに空を読みます - 前の
指を n + 1歩、または n − 1歩進める。 間が 1 つずれると、隣の 節を 外します。 前の 指を n歩進めたあと、 「前の 指の 次が 空に なるまで」 進める 組み合わせで 数を 合わせます headを返す。 先頭を外した ときに、 外した 節を 返してしまいます。 返すのは dummy.nextです- 長さを
数えてから探す。 動きますが、 2 回なめるので 「1 回で」という 条件に 合いません
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「外す節の 1 つ前が
分かれば、 次を 1 つ飛ばせば 外れます。 先頭を 外す場合の ために ダミーの 節を 置き、 そこから 2 本の 指を 出します。 前の 指を n 歩先に 出してから 一緒に 進め、 前の 指が 最後の 節に 着いたら、 後ろの 指の 次が 後ろから n 番目です。 時間は O(L)、 記憶は O(1) です。」
書き終えたら、
「例 1 では n が 2 なので、
前の 指を 2 歩進めて 20 に 置きます。 一緒に 進めると、 前の 指が 30、 40、 50、 後ろの 指が 10、 20、 30 と 進み、 前の 指が 最後の 50 に 着きます。 後ろの 指の 30 の 次を 40 から 50 に 付け替えて、 10、 20、 30、 50 です。」