ホームページ  >  記事  >  バックエンド開発  >  Python データ構造とアルゴリズムのリンク リスト定義の使用方法の詳細な説明

Python データ構造とアルゴリズムのリンク リスト定義の使用方法の詳細な説明

黄舟
黄舟オリジナル
2017-10-04 09:26:151875ブラウズ

この記事では、主にPythonのデータ構造とアルゴリズムにおけるリンクリストの定義と使い方を紹介し、単一リンクリスト、循環リンクリストなどの定義、使用方法、および関連する注意点を具体的な例に基づいて詳しく分析します。参照できます

この記事の例では、Python データ構造とアルゴリズムにおけるリンク リストの定義と使用法について説明します。詳細は以下の通りです:

この記事で説明します:

(1) リンクリストノードの定義から始まり、クラスとオブジェクト指向の形式でリンクリストを設計します。アイデア

(2) リンクリストクラス 挿入や削除、
prepend(先頭挿入)、pop(先頭削除)、append(末尾挿入)、pop_last(末尾削除)などのメンバ関数を実装する際に考慮すべき境界条件

2.1 挿入:

空のリンクリスト
リンクリストの長さは1
最後まで挿入

2.2 削除

空のリンクリスト
リンクリストの長さは1
最後のものを削除要素

(3) 単一リンクリストから単一リンクリストへのさまざまなバリエーション:

尾部付き ノードの単一リンクリスト
円形の単一リンクリスト
二重リンクリスト

1. リンクリストノードの定義


class LNode:
 def __init__(self, elem, next_=None):
  self.elem = elem
  self.next = next_

2. 単一リンクリストの実装

挿入と削除の実装と考慮する必要がある境界の理解に重点を置く 条件:


class LinkedListUnderflow(ValueError):
 pass
class LList:
 def __init__(self):
  self._head = None
 def is_empty(self):
  return self._head is None
 def prepend(self, elem):
  self._head = LNode(elem, self._head)
 def pop(self):
  if self._head is None:
   raise LinkedListUnderflow('in pop')
  e = self._head.elem
  self._head = self._head.next
  return e
 def append(self, elem):
  if self._head is None:
   self._head = LNode(elem)
   return
  p = self._head
  while p.next is not None:
   p = p.next
  p.next = LNode(elem)
 def pop_last(self):
  if self._head is None:
   raise LinkedListUnderflow('in pop_last')
  p = self._head
  if p.next is None:
   e = p.elem
   self._head = None
   return e
  while p.next.next is not None:
   p = p.next
  e = p.next.elem
  p.next = None
  return e

簡単な概要:

(0) 前提条件p.next.next にアクセスできるということは、p.next が空ではないということです。
(1) 末尾の挿入。リンクされたリストが空でない場合は、末尾のノードのポインタのみを変更する必要があります。
(2) 末尾の削除。リンクされたリストの長さが空でない場合、変更する必要があるのは最後から 2 番目のノードのポインタです。

単連結リストの単純な変換: 末尾ノードを持つ単連結リスト


class LList1(LList):
 def __init__(self):
  LList.__init__(self)
  self._rear = None
 ...

書き換える必要があるのは次のとおりです: 先頭の挿入、末尾の挿入、末尾の削除


def prepend(self, elem):
 if self._head is None:
  self._head = LNode(elem)
  self._rear = self._head
 else:
  self._head = LNode(elem, self._head)
def append(self, elem):
 if self._head is None:
  self._head = LNode(elem)
  self._rear = self._head
 else:
  self._rear.next = LNode(elem)
  self._rear = self._rear.next
def pop_last(self):
 if self._head is None:
  raise LinkedListUnderflow('in pop_last')
 p = self._head
 if p.next is None:
  e = p.elem
  self._head = None
  return e
 while p.next.next is not None:
  p = p.next
 e = p.next.elem
 self._rear = p
 p.next = None
 return e

単連結リストのバリエーション: 巡回単連結リスト


class LCList:
 def __init__(self):
  self._rear = None
 def prepend(self, elem):
  if self._rear is None:
   self._rear = LNode(elem)
   self._rear.next = self._rear
  else:
   self._rear.next = LNode(elem, self._rear.next)
 def append(self, elem):
  self.prepend(elem)
  self_rear = self._rear.next
 def pop(self):
  if self._rear is None:
   raise LinkedListUnderflow('in pop')
  p = self._rear.next
  if p is None:
   self._rear = None
  else:
   self._rear.next = p.next
  return p.elem
 def printall(self):
  if self._rear is None:
   raise ...
  p = self._rear.next
  while True:
   print(p.elem)
   if p is self._rear:
    break
   p = p.next

以上がPython データ構造とアルゴリズムのリンク リスト定義の使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。