Python 删除单链接列表中的最后一个节点
我能查一下吗 如何从单个链接列表中删除最后一个节点 这与删除第一个节点的方式相同吗 删除第一个节点Python 删除单链接列表中的最后一个节点,python,singly-linked-list,Python,Singly Linked List,我能查一下吗 如何从单个链接列表中删除最后一个节点 这与删除第一个节点的方式相同吗 删除第一个节点 def deleteAtHead(self): temp = self.head self.head = self.head.next delete temp 删除最后一个节点 def deleteAtTail(self): prev = None temp = self.tail self.tail= self.tail.prev de
def deleteAtHead(self):
temp = self.head
self.head = self.head.next
delete temp
删除最后一个节点
def deleteAtTail(self):
prev = None
temp = self.tail
self.tail= self.tail.prev
delete temp
因为这是一个单链接列表,所以您必须遍历该列表才能在tail之前到达节点。我认为您的功能只需要
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设置为我们先前标识为列表中倒数第二个节点的节点,因为它实际上是列表的新端点
编辑:
以解决对该答案的一些评论的关注。处理单链或双链列表时,最好保持头
、尾
和当前
指针。知道tail的位置对于在列表中插入计算上合理的内容是非常有价值的
这意味着您的插入方法可以如下所示:
def insert(value):
temp = self.head
while(temp.next != None):
temp = temp.next
temp.next = Node()
temp.next.value = value
其时间复杂度为O(n):
它的时间复杂度为O(1)。在复杂度为O(n)=c的单链表中无法执行删除操作,因为您没有前一个列表节点的引用。您必须遍历到列表的末尾,记住当前节点和以前的节点,然后必须将以前的节点从引用修剪到下一个节点,这是您尝试删除的最后一个节点。对于单链接列表,这将始终具有O(n)=n复杂性。您必须从头部开始爬回
尾部。
尾部是没有next的第一个节点:next是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
设置为None
将删除尾部节点(如果没有其他引用,它将被垃圾收集)单链接列表中的节点只知道它的下一个,不知道它的上一个,哦,天哪。我甚至没有注意到它没有双重链接,因为OP在他的代码中使用了prev
。我将编辑我的回复。@ReblochonMasque和OP,我的示例已更新。它已损坏,也不知道它的尾部。。。你必须找到尾巴!我可以理解这不是一个选定的答案,但有谁能提供一些指导,为什么我的答案被否决?我说的没有错,只是不完全是OP想要的。试图建立我的代表和类似的事情让我很困惑。出于好奇,你为什么不保持一个指向列表末尾的指针呢?如果列表很长,并且额外指针的成本非常低,那么每次从头遍历到末尾都非常昂贵。我同意你的观点,但这不是OP要求的,也不是裸骨单链接列表API提供的。我的意思是……他在代码中使用变量self.tail
。我认为可以合理地假设OP正在维护一个指向列表尾部的指针,因为这样做是明智的。我想我也在想是谁否决了我的答案lol。你的意思是“裸骨单链接列表ADT”吗?不,你不应该需要它(双链接列表维护以前的指针,而不是单链接列表)
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