双链接列表python

时间:2016-10-20 04:53:57

标签: python python-3.x doubly-linked-list

我正在使用Python 3.0,我必须创建以下内容:

1)将名为Setplus的ADT实现为有序的双向链表,其中项目从最小项目到列表中最大项目排序

首先,我创建了一个名为Double_Node

的模块
class Double_Node:
    """
    Fields: value stores any value
            next points to the next node in the list
            prev points to the previous node in the list
    """

    ## Double_Node() produces a newly constructed empty node.
    ## __init__: Any -> Node
    def __init__(self, value, prev = None, next = None):
        self.value = value 
        self.prev_node = prev
        self.next_node = next

    def get_next (self):
        return self.next_node
    def set_next (self, n):
        self.next_node = n
    def get_prev (self):
        return self.prev_node
    def set_prev (self, p):
        self.next_prev_node = p
    def get_value (self):
        return self.value
    def set_value (self, d):
        self.value = d


    ## print(self) prints the value stored in self.
    ## Effect: Prints value.
    ## __str__: Node -> Str
    def __str__(self):
        return str(self.value)

然后我创建了一个名为Setplus的类:

class Setplus:
    """
    Field: _head points to the first node in the linked list
           _tail points to the last node in a linked list
    """


    ## Setplus() produces a newly constructed empty setplus.
    ## __init__: -> Setplus
    def __init__(self):
        self._head = None
        self._tail = None

    ## self.empty() produces True if self is empty.
    ## empty: Setplus -> Bool
    def empty(self):
        return self._head == None

    ## value in self produces True if value is an item in self.
    ## __contains__: Setplus Any -> Bool
    def __contains__(self, value):
        current = self._head
        while current:
            if current.get_value == value:
                return True
            else:
                current = current.get_next
        return False

    ## self.distinct() produces True if all items are distinct.
    ## distinct: Setplus -> Bool
    #def distinct(self):

    ## count(value) produces the number of occurrences of value.
    ## count: Setplus Any -> Int
        def count(self, value):
            counter = 0
            current = self._head
            while current != None:
                if current.value == value:
                    counter += 1
                    print (counter)
                else:
                    current = current.next
            return counter

    ## self.add(value) adds value as an item in order.
    ## Effects: Mutates self.
    ## add: Setplus Any -> None 
    def add(self, value):
        new_node = Double_Node(value)
        if self.head == None:
            self.head = new_node
        if self.tail != None:
            slef.tail.next = new_node

        self.tail = new_node

我在创建一个contains方法count时遇到问题,count计算值的数量并添加,这会以正确的非递减顺序添加节点。

先谢谢

2 个答案:

答案 0 :(得分:1)

代码中的第一个主要问题是拼写错误和错误的名称。

在你的一个职能中,有一个明显的拼写错误slef而不是self

还有很多地方你使用两个不同的名称作为同一属性(_headheadnext和{{1}例如)。

您还在next_node类中定义了getter和setter函数,但是只有在Double_Node中尝试使用它们时,才会在不调用它的情况下引用该方法。行Setplus几乎肯定是current = current.get_next

getter和setter函数的简单转换:Python类中通常不需要它们。只需直接使用属性。如果您以后发现需要更多花哨的行为(例如,验证新设置的值或动态生成请求的值),您可以更改类使用current = current.get_next()将属性访问语法转换为方法调用。在其他编程语言中,您通常无法通过这种方式更改属性访问,因此鼓励使用getter和setter方法,以便从一开始就拥有可扩展的API。

(请注意,如果您是学生,您的教师可能不太熟悉Python而不是其他语言,因此他们可能希望您编写getter和setter,即使它们在Python代码中通常是不好的样式。考虑学习如何改为使用property而你可能会在以后大肆宣传!)

我在property中摆脱了getter和setter函数,只是作为一种风格问题。 ,如果您要保留它们(也许是因为它们是您的作业所必需的),那么您应该在代码中使用它们!

最后,要获得您想要帮助的实际问题,按排序顺序插入链接列表,您可能希望执行以下操作:

Double_Node

在按排序顺序插入def add(self, value): new_node = Double_Node(value) if self._head == None: # inserting into empty list self._head = self._tail = new_node else: # inserting into a list that contains at least one node already current = self._head while current and current.value < value: # find a node to insert before current = current.get_next() if current: # not inserting at end of list prev = current.get_prev() if prev: # not inserting at start new_node.set_prev(prev) prev.set_next(new_node) else: # inserting at start self._head = new_node new_node.set_next(current) current.set_prev(new_node) else: # inserting at end new_node.set_prev(self._tail) self._tail.set_next(new_node) self._tail = new_node 之后,您的其他方法可以利用这一事实。例如,add可以停止搜索是否看到的值大于它正在查找的值,__contains__将在一个连续的组中找到所有匹配的值。

答案 1 :(得分:-2)

如果你想使用现有的Python类,你会发现它们很有用。

双重链表:

来自deque模块的

collections

https://docs.python.org/3/library/collections.html#collections.deque

从最小到最大的有序数据结构:

heapq模块,它实现了最小堆。

https://docs.python.org/3/library/heapq.html