Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのリンクリストサイクル


リンクリストがあり、サイクルがあるかどうかを確認する必要があるとします。指定されたリンクリストでサイクルを表すために、posと呼ばれる1つの整数ポインターを使用します。この位置は、テールが接続されているリンクリスト内の位置を表します。したがって、posが-1の場合、リンクリストにサイクルは存在しません。たとえば、リンクリストは[5、3、2、0、-4、7]のようで、pos =1です。したがって、サイクルがあり、テールは2番目のノードに接続されます。

これを解決するには、次の手順に従います-

  • 1つのセットをハッシュセットHとして取得します
  • ヘッドがnullでない場合-
    • ヘッドがHにある場合は、trueを返します
    • Hに頭を追加
    • 頭:=頭の次
  • Falseを返す

理解を深めるために、次の実装を見てみましょう-

class ListNode:
   def __init__(self, data, next = None):
      self.data = data
      self.next = next
def make_list(elements):
   head = ListNode(elements[0])
   for element in elements[1:]:
      ptr = head
      while ptr.next:
         ptr = ptr.next
      ptr.next = ListNode(element)
   return head
def get_node(head, pos):
   if pos != -1:
      p = 0
      ptr = head
      while p < pos:
         ptr = ptr.next
         p += 1
      return ptr
class Solution(object):
   def hasCycle(self, head):
      hashS = set()
      while head:
         if head in hashS:
            return True
         hashS.add(head)
         head = head.next
      return False
head = make_list([5,3,2,0,-4,7])
last_node = get_node(head, 5)
pos = 1
last_node.next = get_node(head, pos)
ob1 = Solution()
print(ob1.hasCycle(head))

入力

List = [5,3,2,0,-4,7]
Pos = 1

出力

True

  1. Pythonでリンクリストのノードを削除する

    いくつかの要素を持つリンクリストがあるとします。私たちのタスクは、リストから特定のノードを削除する関数を作成することです。したがって、リストが1→3→5→7→9のようで、3を削除すると、1→5→7→9になります。 削除するノードを指すポインタ「ノード」があるとすると、ノードを削除するにはこれらの操作を実行する必要があります- node.val =node.next.val node.next =node.next.next 例(Python) 理解を深めるために、次の実装を見てみましょう- class ListNode:    def __init__(se

  2. Pythonの逆リンクリスト

    リンクリストがあるとすると、それを逆にする必要があります。したがって、リストが1→3→5→7のような場合、新しい反転リストは7→5→3→1になります。 これを解決するために、このアプローチに従います- (head、back)を解決するために再帰的な方法でリストの反転を実行する1つの手順を定義します 頭がない場合は、頭を戻します temp:=head.next head.next:=back 戻る=頭 温度が空の場合は、ヘッドを戻します head =temp returnsolve(頭、後ろ) 例 理解を深めるために、次の実装を見てみましょう- class ListNode