この記事では、主に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 サイトの他の関連記事を参照してください。