寒暖差にやられています。ko_ya346です。
ひっさしぶりにleetcodeやります。
19. Remove Nth Node From End of List
後ろからn番目のnodeを取り除く問題。
以前もListNodeクラスを扱う問題が出た気がしますが、うまい使い方が思いつかなかったのでdiscussを参考に解きました。
- tmpクラスを用意(掘り進める用)
- tmpクラスを掘り進めてもheadは変わらない
- これ、なぜだろう。同じ場所を参照しているからかな
- tmpクラスで掘り進めた先でノードを書き換えるとheadに反映される
- tmpクラスを掘り進めてもheadは変わらない
- tmpを掘り進めてノード数をカウント
- tmpをリセット
- スキップしたいノードの手前まで進める
- tmp.nextをtmp.next.nextとしてノードをスキップ
- 仮に一番後ろをスキップしたい場合でも、tmp.next.nextはNoneとなり、参照するものがなくなる事態は発生しません
classの仕様を調べないと腹落ちしない気がしました。
いやはや奥が深い
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: if head.next is None: return None tmp = head # tmpは進んでいく用 cnt = 0 while tmp: cnt += 1 tmp = tmp.next tmp = head if cnt == n: return head.next for i in range(cnt - n - 1): tmp = tmp.next print(id(head)) print(id(tmp)) print(head) print(tmp) tmp.next = tmp.next.next return head