Python-リンクリスト
リンクリストは、リンクを介して相互に接続されている一連のデータ要素です。各データ要素には、ポインタの形式で別のデータ要素への接続が含まれています。Pythonの標準ライブラリにはリンクリストがありません。前の章で説明したノードの概念を使用して、リンクリストの概念を実装します。ノードクラスを作成する方法と、ノードの要素をトラバースする方法については、すでに説明しました。この章では、単一リンクリストと呼ばれるリンクリストの種類について説明します。このタイプのデータ構造では、任意の2つのデータ要素間にリンクは1つだけです。このようなリストを作成し、リストから要素を挿入、更新、削除するための追加のメソッドを作成します。
リンクリストの作成
リンクリストは、前の章で学習したノードクラスを使用して作成されます。Nodeオブジェクトを作成し、このodeオブジェクトを使用する別のクラスを作成します。次のデータ要素を指すように、ノードオブジェクトを介して適切な値を渡します。以下のプログラムは、3つのデータ要素を持つリンクリストを作成します。次のセクションでは、リンクリストをトラバースする方法を説明します。
class Node:
def __init__(self, dataval=None):
self.dataval = dataval
self.nextval = None
class SLinkedList:
def __init__(self):
self.headval = None
list1 = SLinkedList()
list1.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
# Link first Node to second node
list1.headval.nextval = e2
# Link second Node to third node
e2.nextval = e3
リンクリストのトラバース
単一リンクリストは、最初のデータ要素から開始して前方方向にのみトラバースできます。次のノードのポインタを現在のデータ要素に割り当てることにより、次のデータ要素の値を出力するだけです。
class Node:
def __init__(self, dataval=None):
self.dataval = dataval
self.nextval = None
class SLinkedList:
def __init__(self):
self.headval = None
def listprint(self):
printval = self.headval
while printval is not None:
print (printval.dataval)
printval = printval.nextval
list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
# Link first Node to second node
list.headval.nextval = e2
# Link second Node to third node
e2.nextval = e3
list.listprint()
上記のコードを実行すると、次の結果が生成されます。
Mon
Tue
Wed
リンクリストへの挿入
リンクリストに要素を挿入するには、既存のノードから新しく挿入されたノードにポインタを再割り当てする必要があります。新しいデータ要素がリンクリストの最初、途中、または最後に挿入されるかどうかに応じて、以下のシナリオがあります。
リンクリストの先頭に挿入
これには、新しいデータノードの次のポインタをリンクリストの現在の先頭にポイントすることが含まれます。したがって、リンクリストの現在の先頭が2番目のデータ要素になり、新しいノードがリンクリストの先頭になります。
class Node:
def __init__(self, dataval=None):
self.dataval = dataval
self.nextval = None
class SLinkedList:
def __init__(self):
self.headval = None
# Print the linked list
def listprint(self):
printval = self.headval
while printval is not None:
print (printval.dataval)
printval = printval.nextval
def AtBegining(self,newdata):
NewNode = Node(newdata)
# Update the new nodes next val to existing node
NewNode.nextval = self.headval
self.headval = NewNode
list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
list.headval.nextval = e2
e2.nextval = e3
list.AtBegining("Sun")
list.listprint()
上記のコードを実行すると、次の結果が生成されます。
Sun
Mon
Tue
Wed
リンクリストの最後に挿入
これには、リンクリストの現在の最後のノードの次のポインタを新しいデータノードにポイントすることが含まれます。したがって、リンクリストの現在の最後のノードが最後から2番目のデータノードになり、新しいノードがリンクリストの最後のノードになります。
class Node:
def __init__(self, dataval=None):
self.dataval = dataval
self.nextval = None
class SLinkedList:
def __init__(self):
self.headval = None
# Function to add newnode
def AtEnd(self, newdata):
NewNode = Node(newdata)
if self.headval is None:
self.headval = NewNode
return
laste = self.headval
while(laste.nextval):
laste = laste.nextval
laste.nextval=NewNode
# Print the linked list
def listprint(self):
printval = self.headval
while printval is not None:
print (printval.dataval)
printval = printval.nextval
list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
list.headval.nextval = e2
e2.nextval = e3
list.AtEnd("Thu")
list.listprint()
上記のコードを実行すると、次の結果が生成されます。
Mon
Tue
Wed
Thu
2つのデータノードの間に挿入する
これには、特定のノードのポインターを変更して、新しいノードを指すようにすることが含まれます。これは、新しいノードと既存のノードの両方を渡すことで可能になります。その後、新しいノードが挿入されます。したがって、新しいノードの次のポインターを中間ノードの次のポインターに変更する追加のクラスを定義します。次に、新しいノードを中間ノードの次のポインタに割り当てます。
class Node:
def __init__(self, dataval=None):
self.dataval = dataval
self.nextval = None
class SLinkedList:
def __init__(self):
self.headval = None
# Function to add node
def Inbetween(self,middle_node,newdata):
if middle_node is None:
print("The mentioned node is absent")
return
NewNode = Node(newdata)
NewNode.nextval = middle_node.nextval
middle_node.nextval = NewNode
# Print the linked list
def listprint(self):
printval = self.headval
while printval is not None:
print (printval.dataval)
printval = printval.nextval
list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Thu")
list.headval.nextval = e2
e2.nextval = e3
list.Inbetween(list.headval.nextval,"Fri")
list.listprint()
上記のコードを実行すると、次の結果が生成されます。
Mon
Tue
Fri
Thu
いいねリストからアイテムを削除する
そのノードのキーを使用して、既存のノードを削除できます。以下のプログラムでは、削除するノードの前のノードを見つけます。次に、このノードの次のポインターを、削除するノードの次のノードにポイントします。
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
class SLinkedList:
def __init__(self):
self.head = None
def Atbegining(self, data_in):
NewNode = Node(data_in)
NewNode.next = self.head
self.head = NewNode
# Function to remove node
def RemoveNode(self, Removekey):
HeadVal = self.head
if (HeadVal is not None):
if (HeadVal.data == Removekey):
self.head = HeadVal.next
HeadVal = None
return
while (HeadVal is not None):
if HeadVal.data == Removekey:
break
prev = HeadVal
HeadVal = HeadVal.next
if (HeadVal == None):
return
prev.next = HeadVal.next
HeadVal = None
def LListprint(self):
printval = self.head
while (printval):
print(printval.data),
printval = printval.next
llist = SLinkedList()
llist.Atbegining("Mon")
llist.Atbegining("Tue")
llist.Atbegining("Wed")
llist.Atbegining("Thu")
llist.RemoveNode("Tue")
llist.LListprint()
上記のコードを実行すると、次の結果が生成されます。
Thu
Wed
Mon