【问题标题】:Can't remove first node in linked list无法删除链表中的第一个节点
【发布时间】:2012-10-26 16:34:38
【问题描述】:

我正在尝试在 python 中创建一个链表类(我知道毫无意义,但这是一个学习练习),如果我尝试删除第一个元素,我编写的删除节点的方法不起作用链表。如果要删除的节点位于链表中的任何其他位置,则该方法可以正常工作。有人可以告诉我我哪里出错了吗?

到目前为止,这是我的代码:

class Node:

    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next

    def __repr__(self):
      return repr(self.data)

    def printNodes(self):
        while self:
            print self.data
            self = self.next

    def removeNode(self, datum):
        """removes node from linked list"""
        if self.data == datum:
            return self.next
        while self.next:
            if self.next.data == datum:
                self.next = self.next.next
                return self
            self = self.next

【问题讨论】:

  • 作为一个例子,假设我有一个链表 1,2,3,4。如果我调用 removeNode(1),结果是 1,2,3,4。如果我调用 removeNode(3),结果是 1,2,4。
  • 您是否将removeNode 的结果分配回去?换句话说,你是my_linked_list.removeNode(x)还是my_linked_list = my_linked_list.removeNode(x)
  • 那你会想要我回答的后半部分。
  • 仅供参考:在您接受后,我修复了我的答案中的一些错误。
  • 当您执行 obj.method() 而不是 obj = obj.method() 时,返回值是一种不好的形式吗?

标签: python oop linked-list


【解决方案1】:

修改removeNode,使其始终返回链表的头部,然后将结果分配回您的头节点。像这样:

def removeNode(self, datum):
    """removes node from linked list and returns head node"""
    head = self
    curr_node = self
    if curr_node.data == datum:
        head = curr_node.next
    else:
        while curr_node.next:
            if curr_node.next.data == datum:
                curr_node.next = self.next.next
                break
            curr_node = curr_node.next
    return head

或者,如果您想避免将 removeNode 的结果分配回头部:

def removeNode(self, datum):
    """removes node from linked list"""
    curr_node = self
    if curr_node.data == datum:
        # steals the the data from the second node
        curr_node.data = curr_node.next.data
        curr_node.next = curr_node.next.next
    else:
        while curr_node.next:
            if curr_node.next.data == datum:
                curr_node.next = curr_node.next.next
                break
            curr_node = curr_node.next

注意:我将self分配给curr_node是因为修改self感觉不对。

【讨论】:

    【解决方案2】:

    如您的代码所示,removeNode 方法返回链接列表的新第一个节点。您应该使用head = head.removeNode(1) 而不仅仅是调用方法。

    【讨论】:

    • 我最初是这么想的,但这会破坏删除列表中更下方项目的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多