データ構造とアルゴリズム (Python) - 一方向リンクリスト

リンク リストはノードと有向リンクで構成されます。したがって、ノード クラスと一方向リンク リスト操作クラスの 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
    

 

おすすめ

転載: blog.csdn.net/weixin_45958695/article/details/128174502