ブラシの質問のウェブサイト:Leetcode
難易度:簡単
言語:Python
計画:簡単->から中->から難しい。
1.876リンクリストの中間ノード
1.1件名:
ヘッドノードがheadである空でない単一リンクリストが与えられた場合、リンクリストの中央ノードを返します。
中間ノードが2つある場合は、2番目の中間ノードを返します。
- 例1
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
- 例2
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
1.2思考と分析
タイトルは、単一リンクリストという用語を示しています。テーブル内のデータはノードで表され、各ノードは要素(データ要素の画像)とポインター(後続要素の保存場所)で構成されます。
これまでに、基本的に左右の衝突するポインタを使用して、非常に多くのダブルポインタの問題を実行しました。この問題は、ダブルポインタの高速ポインタと低速ポインタで発生する可能性があります。速いポインターと遅いポインターは私の以前の研究ノートで示されました、そしてこのブログはそれらを非常に詳細に紹介します。
基本的な概念は次のとおりです。2つのポインターは、それぞれ高速ポインター(高速)と低速ポインター(低速)として定義されている同じ方向から配列をトラバースし始め、2つのポインターの値が等しくなるまで異なる戦略で移動します。高速で一度に2つのポインターを移動すると仮定すると、低速で一度に1つのポインターを移動します。fastがテールノードに到達してNULLを指す場合、slowはリンクリストのちょうど中央のノードにあります。
したがって、この質問に戻って、高速ポインタと低速ポインタを使用してそれを行うことを検討します。
まず、リンクリストに従って高速ポインタと低速ポインタを定義します
slow = head
fast = head
次に、これと一緒に移動するために2つのポインターが必要であり、最後に遅い値、つまり中間ノードが返されます。
完全なコードは次のとおりです。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
実行結果は以下のとおりです。
1.3まとめ
特に注意してください。この質問は高速ポインタと低速ポインタを使用して行われます。最初は、高速ポインタと低速ポインタの使用が簡単であることを知っているので、まだ混乱しています。上記のコードは、高速ポインタと低速ポインタの基本的な形式であり、後で使用するために覚えておく必要があります。