删除单个链接列表中的lastNode

时间:2016-04-09 08:00:10

标签: python singly-linked-list

我可以查一下吗? 我们如何从单个链表中删除最后一个节点?

是否与我们删除第一个节点的方式相同?

删除第一个节点

def deleteAtTail(self):
    prev = None
    temp = self.tail
    self.tail= self.tail.prev 
    delete temp

删除最后一个节点

{{1}}

3 个答案:

答案 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设置为等于我们之前标识为列表中倒数第二个节点的节点,因为它实际上是列表的新结尾。

修改

解决一些关于这个答案的评论的顾虑。在处理单个或双向链接列表时,最好保持headtailcurrent指针。知道尾部的位置对于在列表中插入计算合理的东西非常有价值。

这意味着你的插入方法可以从这个:

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)时间复杂度。