python - 删除 Python 双链表中的节点时遇到问题

标签 python algorithm linked-list doubly-linked-list

一段时间以来,我一直在尝试在 Python 中创建双向链表,但在使用 LinkedList 类中的一些方法时遇到了问题。我希望我的 removeFrontremoveRear 方法返回被删除的值,但我无法让它工作。使用测试列表,如果我将某个值 x 输入到节点并尝试将其删除,则不会返回 x。

我相信删除一个节点的想法是通过将它的下一个节点与其前一个节点连接起来,将其从列表中删除,但我觉得我在这方面的尝试存在根本性的缺陷。

我也在尝试实现 pop 方法(以删除列表中的特定元素),但不确定从哪里开始。任何能使我朝着正确方向前进的建议都将不胜感激。谢谢。

class Node:

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

class LinkedList:

    def __init__(self):
        self.front = None
        self.rear = None

    def isEmpty(self):
        return self.front is None and self.rear is None

    def addFront(self, data):
        new_node = Node(data)
        if self.front is None:
            self.front = new_node
            self.rear = self.front
            self.front.prev = None
            self.rear.next = None
        else:
            self.front.prev = new_node
            new_node.next = self.front
            self.front = new_node
            self.front.prev = None

    def addRear(self, data):
        new_node = Node(data)
        if self.front is None:
            self.rear = new_node
            self.front = self.rear
            self.front.prev = None
            self.rear.next = None
        else:
            self.rear.next = new_node
            new_node.prev = self.rear
            self.rear = new_node
            self.rear.next = None

    def removeFront(self):
        if self.isEmpty():
            return None
        else:
            removed = self.front
            self.front.prev = self.front
            self.front.prev.next = None
            return removed

    def removeRear(self):
        if self.isEmpty():
            return None
        else:
            removed = self.rear
            self.rear.prev = self.rear
            self.rear.prev.next = None
            return removed

    def pop(self, index):
        # TODO: How to implement?
        pass

    def size(self):
        current = self.front
        count = 0
        while current is not None:
            count += 1
            current = current.next
        return count

最佳答案

下面是带有注释的 removeFront 的实现:

def removeFront(self):
    if self.isEmpty():
        return None

    # Store data so that it can be returned
    data = self.front.data
    if self.front == self.rear:
        # List contains one item, set front & rear to initial state
        self.front = self.rear = None
    else:
        # More than one item
        self.front = self.front.next    # Set front to point next item
        self.front.prev = None          # Front doesn't have previous item

    return data

removeRear 使用完全相同的逻辑。

为了实现pop,你需要考虑三种不同的情况:

  • 正在删除前面
  • 正在删除后部
  • 正在删除 front 和 rear 之间的节点

无论遇到什么情况,您仍然需要找到要删除的正确节点。您可以在列表中前进时循环执行此操作。找到正确的节点后,您可以使用 removeFrontremoveRear 以防它是第一个或最后一个节点。如果节点介于两者之间,则需要将其从前一个节点和下一个节点中剪切下来,并将剩余的节点连接在一起。

关于python - 删除 Python 双链表中的节点时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37090567/

相关文章:

python - Django 中的动态查询,WHERE 子句中包含 "|"字符,表名中包含变量

algorithm - 红绿灯图

algorithm - 如何找到图循环中的顶点

c - 在c中反转链表时出现段错误问题

python - Google Cloud 'ascii' 编解码器无法在安装期间解码字节 0xe1

python - 在 docker 中安装时 Pipenv 抛出错误

java - ConcurrentSkipListMap 有什么好处?

c - 链表 C 程序不产生输出

c - 在C中的单链表中交换位置

python - 使用 JSON 时出现 Unicode 错误