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