93262


以下で公開されている解答例について、Pythonの代入ルールに関する質問がございます。  
<https://leetcode.com/problems/remove-nth-node-from-end-of-
list/solutions/1164537/short-simple-one-pass-solution-w-explanation-
beats-100-no-dummy-node-required/?orderBy=most_votes>

いくつかの解法の中で、以下のようなコードがあります。

[code]

    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
    ptr, length = head, 0
    while ptr:
        ptr, length = ptr.next, length + 1
    if length == n : return head.next
    ptr = head
    for i in range(1, length - n):
        ptr = ptr.next
    ptr.next = ptr.next.next
    return head
    
[/code]

解法の考え方は理解しているのですが、以下のコードでなぜheadの中身が変更されることになるのかが理解できません。pythonでの代入はcopyとは異なるため、ptrの変更もheadに反映されるのだとしても、以下のコードでは最終的にptrは"インデックスがlength-
n番目から始まる線形リスト"になっており、"元の線形リストの後ろからn番目を飛ばしたもの"にはなっていないのではないかと思います。

[code]

    ptr = head
    for i in range(1, length - n):
        ptr = ptr.next
    ptr.next = ptr.next.next
    
[/code]

上記コードによりなぜ正しい答えが得られるのか、どなたかご教授いただけるとありがたいです。


CC BY-SA 4.0
2023-01-09T03:10:51.370
93261
2023-01-09T04:23:21.947
56454
question
python
leetcodeの問題19. Remove Nth Node From End of Listのとある解答についてです。


`head`が線形リスト全体を表すデータと勘違いされているのではないかと予想します。

問題文に記載されている前提を読むとわかりますが、`ListNode`は、線形リストの1要素を示すものです。

[code]

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, val=0, next=None):
    #         self.val = val
    #         self.next = next
    
[/code]

`head`はその先頭要素を指しており便宜上線形リスト全体を示しています。そのため、関数の戻り値として`head`を返しています。  
(例外として、`n == length`(先頭要素を削除する)ケースだけ`head.next`を返してます)

ですので、

> 最終的にptrは"インデックスがlength-n番目から始まる線形リスト"になっており、"元の線形リストの後ろからn番目を飛ばしたもの"にはなっていない

という理解は正しいですが、関数内でしか使っていないので、処理結果として捉えるのは間違っていると思います。

＃"元の線形リストの後ろからn番目を飛ばしたもの"にするための処理は質問文で抽出している箇所で行ってますね。


CC BY-SA 4.0
2023-01-09T04:23:21.947
93262
2023-01-09T04:23:21.947
20098
93261
answer