それでは毛玉諸君、これにて失敬

日々の精進を備忘録的に綴ります。

leetcode日記7

寒暖差にやられています。ko_ya346です。
ひっさしぶりにleetcodeやります。

19. Remove Nth Node From End of List

後ろからn番目のnodeを取り除く問題。
以前もListNodeクラスを扱う問題が出た気がしますが、うまい使い方が思いつかなかったのでdiscussを参考に解きました。

  • tmpクラスを用意(掘り進める用)
    • 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