スポンサーリンク

【Python】連結リストの概要・イメージ・実装・使い方を整理

スポンサーリンク
スポンサーリンク
この記事は約3分で読めます。

連結リストに関するメモ。

自分が腹落ちすることを優先で自分のイメージで書く。

 

 

連結リストについて

概要

 

通常のリストとの違い

Pythonのリストは先に箱を用意しておき、その箱の中に要素を格納していくイメージ。

一方で連結リストには箱はなく、それぞれの要素は次の要素への道標を持っているので、道標をつなぐイメージ。各要素がそれぞれ次の要素への道標をつなぎ続けることで、連結されたリストができあがる。

 

連結リストの実装と操作

 

単方向連結リストの実装

・以下はクラスListNodeの実装

これはListNodeという名前のクラス。

ListNodeと書いてある通り、連結リストの各ノード(要素)を指すオブジェクト。

普段よく使うリストから連想すると、各要素を格納しておく箱をイメージしてしまうかもしれないが、これは連結リストのそれぞれの要素を表している。

self.valにはこのノード(要素)の値、self.nextには次のノードが格納される。

最初の方に次のノードを指すというようなことを書いたが、

次のノードがself.nextに丸ごと格納されるような形になる。

node1 = [val1, next]

node1 = [val1,[node2]]

node1 = [val1, [val,2 next]]

node1 = [val1, [val2, [val3, next]]]

※node2はその中にvalとnode3を持つ。入れ子構造

 

 

・ListNodeのインスタンス、つまり連結リストの一つの要素を作る

LeetCodeではもともと定義されているListNodeをインスタンス化してprintすると、以下のように表示される

ListNode{val: 0, next: None}

 

ただし、自分で全く同じ内容で再定義すると、コマンドプロンプトで実行した場合と同じように表示される

<__main__.ListNode object at 0x000・・・>

※これはこのインスタンスがメモリ上のどこにあるかを指しているかということで合っているんだろうか

 

 

・複数のノードをつないで連結リストを作ってみる。

one,two,threeをそれぞれListNodeのインスタンスとして用意して、

one.の後ろ(one.next)にtwoを、twoの後ろ(two.next)にthreeを格納してからprintすると、

LeetCodeでは以下のように表示された。

ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: None}}}

 

・for文で連結リストを作る

LeetCode上ではprintすると↓このように表示される

ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: None}}}}

 

コマンドプロンプトで実行できるように少し変更してみる。

 

 

コメント