スポンサーリンク

【LeetCode】19. Remove Nth Node From End of List 解答・解説【Python】

スポンサーリンク
スポンサーリンク
この記事は約4分で読めます。

学習メモ。

自分の言葉で書くことで理解できていない部分をはっきりさせる。

問題

原文

Given the head of a linked list, remove the nth node from the end of the list and return its head.

 

Example 1:

Example 2:

Example 3:

 

Constraints:

  • The number of nodes in the list is sz.
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

 

Follow up: Could you do this in one pass?

 

内容

連結リストheadが与えられます。連結リストの後ろからn番目のノード(要素)を削除し、headを返してください。

※正しくない可能性があります。

解答

解答1:Python, two pointer

 

・連結リストの削除操作について

連結リストは、ある要素から次の要素へ数珠つなぎのように指してつながっている。

削除操作をする場合はPythonのリストのように要素を消すのではなく、今の要素から次の次の要素を指すことで、次の要素を削除することができる

 

・for節について ※なぜ最初にn回fastを進めるのか。

Pythonのリストであれば、添字で後ろからn番目の要素を指して削除できるが、

単方向連結リストでは、(たぶん)前から後ろにしか進むことができないので、

削除対象を前から数える必要がある。

連結リストで前から何番目の要素であるかを指すためにfast,slowの2つのポインタを使うが、

先にfastをn回進めて置き、

その後でfastの残りの要素分、fastとslowを同時に進めると、(while節の操作)

削除対象の要素がslow.nextになる。

 

・if節について

for節の実行で、最後の要素まで到達してしまう場合がある。

head = [1], n=1、 head=[1,2,3,4,5], n = 5のように要素数とnの数が一致する場合を指す。

これは、後ろからn番目、つまり先頭の要素を削除すると良い。

head= [1,2,3], n = 6のように要素数を超えるnの数は、要素がなくなってしまうので問題の制約としてこの事例は起こらないようにされている。

 

 

・テストケース3:head=[1,2],n=1の場合

for節の実行終了後、fastの中身は[value:2, next=None]となり、連結リストの最後まで到達している。

while文では、fast.nextがNoneでない限り処理を行うが、fast.nextはNoneのため、while節は実行されない

slowはheadの先頭要素を指しているが、2つ目の要素かつ最後の要素である2の削除操作をすることになる。

 

解答2:Rust

写経

 

補足・参考・感想

■補足

■参考

■感想

1回目に見たときは理解できなかったので写経だけやって無視してた問題。

問題の前提を確認しつつ、いくつかの解答案と良し悪し説明する。しかも英語でコミュニケーションして、10分くらいでホワイトボードにコードを書けるようにならないとダメと考えると、この問題の解き方を1つ知っただけだと必要な準備の1割も達成できていない。

前:344. Reverse String

次:567. Permutation in String

LeetCode 解答・解説記事一覧

コメント