単一のリスト
データ要素及び組成物の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()
これらの関数の上記の方法は比較的単純であり、フォローアップは、より深いアルゴリズムに到達しますが、長い学び、練習し、自分の手をして、徹底的な演習のいくつかの例を見つけるための忍耐などとして、それは絶対に問題はありません。