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

黄舟
リリース: 2017-10-04 09:26:15
オリジナル
1881 人が閲覧しました

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート