[]データ構造 - 単一のリスト、簡単な単鎖(非常に詳細に説明)を作成するために使用パイソン

単一のリスト

データ要素及び組成物の1つのデータ要素を指し示すポインタ、アドレスポインタは、各ノードに接続されている:リンクされたリストデータはノードで表され、各ノードは、チェーンの単独でリンクされたリストデータ構造です。

はっきり:単一リンクリストは、各後続ノードに先行ノードポインティングからノードとの間に接続されたポインタと、ノードの数で構成されています。

(約ここで話すことはないC言語のポインタとして、参照するだけで仮想ポインタです)


以下のリストには、各機能を説明単一のインスタンスを作成し、最初のディストリビューションのいくつかの機能を実装することで、最終的に完全なコードを与えられました

まず、ノードクラスを作成します

どのデータ要素と、1つのデータ要素を指すポインタが含まれています

class Node(object):
    """创建单个结点类"""
    def __init__(self, data):
        self.data = data
        self.next = None

 その後、クラスの単一のリストを作成します

これは、いくつかの機能が含まれ、以下の機能は、このクラスに含まれている書き込み。

単一のリストを作成するには、このクラスでは、まず、ヘッドノードを初期化する初期化関数を書きます

その後Trueを返し、空の場合、このリストは、空であるかどうかを決定する関数を書きます

class SingleLinkedList(object):
    """创建一个单链表"""

    def __init__(self):
        self.head = None

    def is_empty(self):
        """判断链表是否为空"""
        return self.head is None

一本鎖の長さを取得する機能を作成します。

CURとして、現在、英語、意味:今、ノードは現在のポインタ、スクラッチノードを表します

カウントは、ノードが空でない場合、長さがインクリメントされ、再び現在のポインタノード(CUR)移動し、次のCUR CURに変更され、リストの長さです。

def length(self):
    """获取链表的长度"""
    cur = self.head
    count = 0
    while cur is not None:
        count += 1
        cur = cur.next
    return count

リストの先頭に要素を追加します。

私たちは、新しいノードを作成し、元のノードのヘッドノードへのポインタポイントを作成する必要が最初に新しいノードが新しいのでこと、新しいノードにこのタイトルのリストは、ヘッドノード(頭を)リンクヘッドノード。

def add_fist(self, data):
    """在链表的头部添加元素"""
    node = Node(data)
    node.next = self.head
    self.head = node

リストの末尾に要素を追加します。

我々は2例を考慮する必要があり、この時間:リストが空では、リストは空ではありません

リストが空の場合、我々はこの新しいノードはヘッドノードの位置に挿入されますすることができます

リストが空でない場合、我々はリストの末尾にポインタを移動する必要がある場合、新しいノードは、最後に追加され、最終的なノード、その位置に挿入されます。

def add_last(self, data):
    """在链表的尾部添加元素"""
    node = Node(data)
    if self.is_empty():
        self.head = node
    else:
        cur = self.head
        while cur.next is not None:
            cur = cur.next
        cur.next = node

リスト内の指定された位置にある要素を追加します。

リスト内の要素の位置、データ:データ要素我々は、この機能を使用するときは、インデックスを指定する必要があります

事態の途中に挿入され、エラー条件、状況が尾をケースに挿入され、頭部に挿入されている:私は4例を検討してここにいます

エラーケースは:指定されたインデックスは、リストの長さ未満ゼロ以上であり、そしてそれはこの位置に確かでない場合は、エラーと判定されます

例頭部に挿入:インデックスがリストの一番上に挿入された、0であるとき、私たちは、この機能の上に書かれ、そのライン上で直接呼び出しています。

ケースの末尾に挿入された:インデックスは、リストの長さである最終面のリストに挿入されたとき、それはまた、直接呼び出すことができるされています

ケースとの間に挿入された:この状況は特別なケースではない、位置にポインタが移動したインデックスの位置の前に添加し、その後挿入されるように、数をカウントする必要があります。中心的な考えは、元のノードCUR、新しいノードCURノードを指すようにポインタをノードポインタに新たな後継ノード点ということです。

(一つはその後、私たちは、答えに他の1の時より簡潔な方法はありませんので、多くのケースを分離する必要がある、頼むかもしれないはい、これは他の方法を使用するだけの方法である:?であることも、この機能を実行することができます)

def insert_node(self, index, data):
    """在指定位置添加元素"""
    node = Node(data)
    if index < 0 or index > self.length():
        return False
    elif index == 0:
        self.add_fist()
    elif index == self.length():
        self.add_last()
    else:
        cur = self.head
        count = 0
        while count < index - 1:
            cur = cur.next
            count += 1
        node.next = cur.next
        cur.next = node

指定されたノードを削除します。

ここでは、2つのポイント:削除されたノードは、削除ノードは最初のノードの最初のノードではありません

その上にヘッドノードの次のノードへの最初のノードのタイトルに直接この状況:削除されたノードが最初のノードであります

削除されたノードが最初のノードではありません。この状況は、ニーズ徐々にポインタを移動するために、見つけること、そしてあなたは、削除する要素を見つけるまで。ノードへのポインタ(現在の検索ノード)、その先行ノード:我々は2つのノードが必要

CURは、初期化時に電流ノード、その先行ノードのプレ代わっを表しているので、ヘッドノードではなく、ヘッドノード前駆ノードへCUR点は、それほどなしに初期化。その後の時間に後方に移動するには、割り当てを交換することができます。

最後に、我々は、そのプレ後継ノードcur.nextに我々だけ、その先行ノード点は、このように接合CURの中央をスキップするように、CUR現在のポイントであるノードを削除することが見出され、それによって、削除を完了する。

def remove_node(self, data):
    """删除指定结点"""
    cur = self.head  # 指针指向的结点
    pre = None  # 指针指向结点的前一个
    if self.head == data:
        self.head.next = self.head
    else:
        while cur.data is not data:
            pre = cur
            cur = cur.next
        pre.next = cur.next

ある場合は、指定されたノードを探します

同様に削除操作で、私たちは(CUR = cur.next)バック探し続けて、検索するノードへのアップが見つかりました。

def search_node_is_exist(self, data):
    """查找指定结点是否存在"""
    cur = self.head
    while cur is not None:
        if cur.data == data:
            return True
        else:
            cur = cur.next
    return False

通って、リスト全体を印刷

常に後方に見て、それが各ノードごとにプリントアウトすることになりそうです

def traversal(self):
    """遍历整个链表"""
    cur = self.head
    while cur is not None:
        print(cur.data)
        cur = cur.next

主な機能検査

上記の関数呼び出しの

if __name__ == '__main__':
    lists = SingleLinkedList()
    lists.add_fist(2)
    lists.add_fist(1)
    lists.add_last(4)
    lists.insert_node(2, 3)
    lists.traversal()
    print(lists.is_empty())
    print(lists.length())
    lists.remove_node(4)
    print(lists.search_node_is_exist(3))
    lists.traversal()

 出力のスクリーンショット

完全なコード

class Node(object):
    """创建单个结点类"""
    def __init__(self, data):
        self.data = data
        self.next = None


class SingleLinkedList(object):
    """创建一个单链表"""

    def __init__(self):
        self.head = None

    def is_empty(self):
        """判断链表是否为空"""
        return self.head is None

    def length(self):
        """获取链表的长度"""
        cur = self.head
        count = 0
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def add_fist(self, data):
        """在链表的头部添加元素"""
        node = Node(data)
        node.next = self.head
        self.head = node

    def add_last(self, data):
        """在链表的尾部添加元素"""
        node = Node(data)
        if self.is_empty():
            self.head = node
        else:
            cur = self.head
            while cur.next is not None:
                cur = cur.next
            cur.next = node

    def insert_node(self, index, data):
        """在指定位置添加元素"""
        node = Node(data)
        if index < 0 or index > self.length():
            return False
        elif index == 0:
            self.add_fist()
        elif index == self.length():
            self.add_last()
        else:
            cur = self.head
            count = 0
            while count < index - 1:
                cur = cur.next
                count += 1
            node.next = cur.next
            cur.next = node

    def remove_node(self, data):
        """删除指定结点"""
        cur = self.head  # 指针指向的结点
        pre = None  # 指针指向结点的前一个
        if self.head == data:
            self.head.next = self.head
        else:
            while cur.data is not data:
                pre = cur
                cur = cur.next
            pre.next = cur.next

    def search_node_is_exist(self, data):
        """查找指定结点是否存在"""
        cur = self.head
        while cur is not None:
            if cur.data == data:
                return True
            else:
                cur = cur.next
        return False

    def traversal(self):
        """遍历整个链表"""
        cur = self.head
        while cur is not None:
            print(cur.data)
            cur = cur.next


if __name__ == '__main__':
    lists = SingleLinkedList()
    lists.add_fist(2)
    lists.add_fist(1)
    lists.add_last(4)
    lists.insert_node(2, 3)
    lists.traversal()
    print(lists.is_empty())
    print(lists.length())
    lists.remove_node(4)
    print(lists.search_node_is_exist(3))
    lists.traversal()

これらの関数の上記の方法は比較的単純であり、フォローアップは、より深いアルゴリズムに到達しますが、長い学び、練習し、自分の手をして、徹底的な演習のいくつかの例を見つけるための忍耐などとして、それは絶対に問題はありません。 

发布了12 篇原创文章 · 获赞 14 · 访问量 4439

おすすめ

転載: blog.csdn.net/weixin_42193813/article/details/104246847