を最後のノードを削除
def deleteAtHead(self):
temp = self.head
self.head = self.head.next
delete temp
最初のノードを削除します。私はあなたの関数は、単に一時はちょうどリストの最後の前のノードと同じであるので、我々はself.tail = temp
を設定
def deleteAtTail(self):
temp = self.head
while(temp.next != None):
if temp.next == tail: #finds the node just before tail
break
temp = temp.next
temp.next = None
self.tail = temp
する必要があるだろうと思います。したがって、tempを削除し(最後の参照を削除して)、リストの2番目のノードから最後のノードに指定されたnodeと同じtailを設定します。これは実際にリストの新しい終わりになります。
EDIT:
この回答へのコメントのいくつかの懸念に対処するために。単一または二重リンクリストを扱うときは、head
,tail
およびcurrent
ポインタを維持することをお勧めします。テールがどこにあるかを知ることは、計算上妥当なものをあなたのリストに挿入するために非常に貴重です。
これはあなたの挿入方法は、ここから行くことができることを意味します
def insert(value):
self.tail.next = Node()
self.tail.next.value = value
self.tail = self.tail.next
、実質的に、より有利な時間複雑性を有するものです。このまでの時間の複雑性O(n)を持ってい
def insert(value):
temp = self.head
while(temp.next != None):
temp = temp.next
temp.next = Node()
temp.next.value = value
O(1)の
なぜdownvote? O_o –
好奇心から、リストの末尾にポインタを置くだけではどうですか?リストが長く、余分なポインタのコストが非常に低い場合、頭から毎回末尾までトラバースするのは非常に高価です。 –
私はあなたに同意しますが、それはOPが求めているものではありません - それはまた、裸の骨が単独でリンクされたリストAPIが提供するものではありません。 –