リンク リストはノードと有向リンクで構成されます。したがって、ノード クラスと一方向リンク リスト操作クラスの 2 つのクラスを生成できます。
ノードクラス:
ノード クラスは、単一リンク リストのノードを構築するために使用され、ノードには値とポインティングの 2 つの部分が含まれます。(ノード クラスには方向性がないため、次のパラメータのデフォルトは None であると仮定します)
class Node:
def __init__(self, val, next=None):
self.val = val #将val传入的值赋给self.val
self.next = next #next始终为None,不具备指向性,在实例化时进行指向
以下はインスタンス化の例です。
ノード 1 (val=1)、ノード 2 (val=2) を作成し、ノード 1 をノード 2 にポイントします。
node1 = Node(1) # ①
node2 = Node(2) # ②
node1.next = node2 # ③
一方向リンクリストクラス:
単一リンク リスト クラスを作成する場合は、最初にヘッド ノードを作成する必要があります。ヘッド ノードはリンク リストの先頭のみを表すため、割り当ては必要ありません。
1. ヘッド ノードを作成します。
class LinkList:
def __init__(self):
self.head = Node(None) # 通过之前的Node类创建一个链表的头结点
以下はインスタンス化の例です。
ヘッドとノードを持つ単一リンクリストを作成します。
アイデア: まずヘッド ノード、ノードを生成し、次にヘッド ノードがそのノードを指すようにします。
l = LinkList() # 用l将linklist实例化,之后l就具有了linklist所具有的属性
node = Node(1) # 生成节点
l.head.next = node # l.head就是生成的头节点:Node(none),图中用node_head表示
# .next表示将头节点指向node
上の図から、ヘッド ノードを介してノードを見つけるにはどうすればよいでしょうか? —— l.head.next はどのようにしてノードの値にアクセスしますか? -l.head.next.val
2. リストをリンクされたリストに変換します。
アイデア: リストにアクセスして、ループ内の各リストの値にノードを追加します。現在到達しているノードを表す一時変数 p を導入します。最初に p がヘッド ノードにあり、ヘッド ノードにノード 1 を追加し、次に p がノード 1 に移動し、ノード 1 にノード 2 を追加し、次に p がノード 2 に移動し、ノード 2 にノード 3 を追加します...リストの要素がすべて追加されるまで。
# 将列表转换为链表
def init_list(self, list_):
p = self.head # 将头节点赋给p
for item in list_: # 循环遍历列表
p.next = Node(item) # 将下一个节点添加在当前节点(p)之后
p = p.next # 将p移动到下一个节点
3. リンクされたリストを走査し、値を返します。
# 遍历列表并返回值
def show(self):
p = self.head.next
while p is not None:
print(p.val)
p = p.next
4. リンクされたリストをすべてクリアします
アイデア: ヘッド ノードの次を None に設定するだけです。Python は残りのデータを自動的にクリーンアップします。
# 清空全部链表
def clear(self):
self.head.next = None
5. 空かどうかを確認します
# 检查链表是否为空
def is_empty(self):
if self.head.next is None:
return True
else:
return False
6.挿入
①テールプラグ方式:
アイデア: p を最後のノードまでトラバースし、最後のノードの後にノードを追加します。
# 在链表末尾插入一个节点
def append(self, val):
p = self.head
while p.next is not None:
p = p.next
p.next = Node(val)
②ヘッド挿入方法:
アイデア: 挿入されるノードの次のノードをヘッド ノードの次のノードにポイントし、ヘッド ノードの次のノードがこのノードをポイントするようにします。
def head_insert(self, val):
node = Node(val) # ①
node.next = self.head.next # ②
self.head.next = node # ③
③ランダム挿入方法:
アイデア: 現在のノードの位置を示す一時変数 p を導入します。pをindex-1の位置に移動し、頭の挿入方法と同じ考え方で挿入します。
# 在index处插入节点
def insert(self, index, val):
p = self.head
for i in range(index):
if p.next is None:
break
p = p.next
node = Node(val)
node.next = p.next
p.next = node
7. ノードの位置を渡し、対応する値を取得します
def get_index(self, index):
p = self.head.next
for i in range(index):
if p.next is None:
raise IndexError("list index is out of range")
p = p.next
return p.val
8. ノード削除操作(値による削除)
def delete(self, x):
p = self.head
while p.next and p.next.val != x:
p = p.next
if p.next is None:
raise ValueError("x is not found")
else:
p.next = p.next.next