我可以查一下吗? 我们如何从单个链表中删除最后一个节点?
是否与我们删除第一个节点的方式相同?
删除第一个节点
def deleteAtTail(self):
prev = None
temp = self.tail
self.tail= self.tail.prev
delete temp
删除最后一个节点
{{1}}
答案 0 :(得分:2)
你必须从头部开始爬回Icon
。
尾部是第一个没有下一个节点的节点:tail
。
跟踪倒数第二个(next is None
),将其prev
设置为next
。
None
将def deleteAtTail(self): # remove_last would likely be a better name
""" removes the last element of the singly linked list
"""
temp = self.head
while(temp.next is not None):
prev = temp
temp = temp.next
prev.next = None
设置为prev.next
会删除尾节点(如果没有其他引用,它将被垃圾收集)
答案 1 :(得分:1)
由于您没有引用上一个列表节点,因此无法在O(n)= c复杂度的单链表中执行删除操作。您将不得不遍历到列表的末尾,记住当前节点和上一个节点,然后您必须修剪前一个节点,然后是下一个节点,这是您尝试删除的最后一个节点。对于单链接列表,这将始终具有O(n)= n复杂度。
答案 2 :(得分:0)
因为这是一个单链表,你必须遍历列表才能到达尾部之前的节点。我认为你的功能只需要
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
我们设置self.tail = temp
因为temp等于列表结尾之前的节点。所以我们删除temp(删除它的最后一个引用),然后将tail设置为等于我们之前标识为列表中倒数第二个节点的节点,因为它实际上是列表的新结尾。
修改强>
解决一些关于这个答案的评论的顾虑。在处理单个或双向链接列表时,最好保持head
,tail
和current
指针。知道尾部的位置对于在列表中插入计算合理的东西非常有价值。
这意味着你的插入方法可以从这个:
def insert(value):
temp = self.head
while(temp.next != None):
temp = temp.next
temp.next = Node()
temp.next.value = value
具有时间复杂度O(n):
def insert(value):
self.tail.next = Node()
self.tail.next.value = value
self.tail = self.tail.next
具有显着更有利的O(1)时间复杂度。