首页 > 解决方案 > 完整的 Python 类

问题描述

我正在做一项任务,但进展并不顺利。这是我的代码不是很好:

from dataclasses import dataclass

@dataclass
class Node:
    value: int = None
    nxt: Node = None  

@dataclass
class Deque:
    head: Node = None      # First node in queue
    tail: Node = None      # Last node in queue
    size: int = 0

    def add_first(self, n):
        new = Node(n, None)
        if self.head is None:
            self.head = new
            self.tail = new
        self.size += 1


        s = "{ "
        node = self.head
        while node is not None:
            s += str(node.value) + " "
            node = node.nxt
        s += "}"
        return s

    
    def add_last(self, n):
        new = Node(n, None)
        if self.head is None:
            self.head = new
            self.tail = new
        else:
            self.tail.nxt = new
            self.tail = new
        self.size += 1

    def get_last(self):
        if self.tail is None:
            print("Get can't be applied on an empty list")
            return None
        else:
            return self.tail.value       

    def get_first(self):
        if self.head is None:
            print("Get can't be applied on an empty list")
            return None
        else:
            #node = self.head
            return self.head.value

    def remove_first(self):
        if self.head is None:
            print("Remove can't be applied on an empty list")
        elif self.head == self.tail:
            s = self.head.value
            self.head = None
            self.tail = None
            self.size -= 1
            return s
        elif self.size == 1:
            node = self.head
            self.head = self.head.nxt
            self.size -= 1
            return node.value

输出:{ 1 2 3 4 5 6 7 8 9 10 } 尺寸:10 { 20 19 18 17 16 15 14 13 12 11 1 2 3 4 5 6 7 8 9 10 } 尺寸:20

更新:我找到了我的问题的答案。这是关于 def add_first 和 def remove last 以及 def remove first 的问题。

标签: pythonclass

解决方案


因为这是家庭作业,所以我不会给出固定的代码,但我会指出需要修复的地方。我相信我找到了所有必需的修复程序,但我可能是错的,因为您没有共享用于测试双端队列的代码:

  1. 您的add_first方法不必要地遍历所有节点,然后将最后一个节点(tail)的nxt值设置为新节点,这意味着新节点将出现在双端队列的末尾。相反,您需要做的就是将nxt新节点的 设置为 current head,然后设置head为新节点。
  2. 除非双端队列中有一个节点,否则您remove_first不考虑任何情况。在所有其他情况下,您必须将 Deque 设置head为其旧 节点。headnxt
  3. 除非双端队列中有一个节点,否则您remove_last也不会考虑任何情况。在所有其他情况下,您必须遍历 Deque 的节点,从 开始head,直到找到一个nxt值为 Deque 的节点tail,然后将其设置nxt为 None,并将 Deque 的tail设置为该节点。
    在节点之前查找节点的示例tail
    node = self.head
    while node.nxt != self.tail:
        node = node.nxt
    node.nxt = None
    self.tail = node
    

推荐阅读