アメリカの大学で奮闘中

アメリカの大学でプログラミングを学ぶべくコンピューターサイエンス学部に留学したものの挫折し数学科に転部した著者が、自分の挫折ポイントを踏まえて数学、プログラミング、アルゴリズムついてできる限り分かりやすく解説してみるブログ。*できる限り記事の内容は技術的な間違いをしないように気をつけていますが、もし間違いがあれば教えていただけると助かります。

片方向リストと双方向リストを大学生が解説してみた by python

以前の記事で連結リストの実装を簡単に紹介しました。

 

astrostory.hatenablog.com

 

実を言うと前回は連結リストの中でも一番シンプルで簡単な線形リストの片方向連結リストの解説を行いました。

 

ですが実際は連結リストはいくつかの種類があり、今回の記事ではそれらを解説したいと思います。

 

 

片方向リスト vs 双方向リスト

以前の記事(上に貼っている記事)で紹介した連結リストは片方向リストでした。片方向リスト先頭があってそこから最後のノードに向かって順番に接続している状態です。

 

それに対して双方向リスト先頭から最後のノードという向きだけでなく、最後から先頭の向きもノードが接続している状態です。

 

*ノードは下の図の箱のことです。

f:id:Astrostory:20220129133820p:plain

片方向連結リストの図解

f:id:Astrostory:20220129135036p:plain

双方向連結リスト

 

前回の記事のおさらいですが、(片方向)連結リストは先頭から最後のノードまでの繋がりを(最後のノードを除く)各々全てのノードが次のノードの情報を持つことで表現していました。

 

なので、双方向リストは次のノードの情報に加えて前のノードの情報も持つことで前後の繋がりを表現しています。

 

 

双方向リストを実際に実装してみましょう。

 

class LinkedList:

    class Node:

        def __init__(self, payload):

            self.payload = payload

            self.next = None

            self.prev = None

    

    def __init__(self):

        self.head = None

 

    def addNode(self, newpayload):

        newnode = LinkedList.Node(newpayload)

 

        if self.head == None:

            self.head = newnode

            return

            

        else:   #最後のノードに連結するケース

            runner = self.head

            while runner.next != None:

                runner = runner.next

            runner.next = newnode

            runner.next.prev = runner

 

links = LinkedList()

links.addNode(26)

links.addNode(99)

links.addNode(127)

links.addNode(42)

links.addNode(367)

 

*わかりやすくするために双方向リストにするために片方向リストから追加したコードをこの書体に変えています

 

コードとしては、

(片方向)連結リストはnextという変数で次のノードの情報を持っていましたが、双方向リストはそれに加えてprev(previouの略)という変数で前の情報を持っています。

 

それにより双方向リストでは先頭から最後のノードまで、最後のノードから先頭までの向きのルートも接続させることはできます。

 

連結リストの続きの記事が気になる方はこちらから

 

astrostory.hatenablog.com

 

 

参考文献

学術論文ではアウトですが..

ご勘弁を

連結リスト - Wikipedia