节点两次添加到列表中

时间:2018-10-11 17:33:53

标签: python function class nodes

这是我的代码,如果任何间距错误都将忽略,该代码在python中可以正常工作。

class Node:
    def __init__(self, value):
        self.value = value  
        self.next = None 

    def __str__(self):
        return "Node({})".format(self.value)

    def getNext(self):
        return self.next

    def getValue(self):
        return self.value

    def setNext(self, new_next):
        self.next = new_next

    def setValue(self, new_value):
        self.value = new_value


    __repr__ = __str__



class OrderedLinkedList:
    def __init__(self):
        self.head=None
        self.tail=None
        self.count = 0

    def __str__(self):
        temp=self.head
        out=[]
        while temp:
            out.append(str(temp.value))
            temp=temp.next
        out=' '.join(out)
        return ('Head:{}\nTail:{}\nList:{}'.format(self.head,self.tail,out))

    __repr__=__str__

    def add(self, value):
        #write your code here

        if self.head == None:
            new_node = Node(value)
            self.head = new_node
            self.tail = self.head
            self.head.setNext(self.tail)


        if self.head.value > value:
            new_node = Node(value)
            new_node.value = value
            new_node.next = self.head
            self.head = new_node

        else:
            new_node = Node(value)
            self.tail.setNext(new_node)
            self.tail = new_node

        self.count += 1




    def pop(self):
        #write your code here
        if self.head == None:
            return 'List is empty'

        if len(self) == 1:
            value = self.head.getValue()
            self.head = None
            self.tail = None
            self.count = 0
            return value

        current = self.head
        while current.next is not self.tail:
            current = current.getNext()

        value = self.tail.getValue()
        self.tail = current
        self.tail.next = None

        self.count -= 1
        return value






    def isEmpty(self):
        #write your code here
        return self.head == None

    def __len__(self):
        #write your code here
        return self.count

我唯一的问题是,当我第一次使用函数add时,它会将数字相加两次。下面是我每次都调用add时的结果,之后每次仅添加一次。我该如何解决,使其仅将第一个数字加一次而不是两次。

>>> x=OrderedLinkedList()
>>> x.add(2)
>>> print(x)
Head:Node(2)
Tail:Node(2)
List:2 2

add(item)将一个具有value = item的新Node添加到列表中,以确保保留升序。它需要该项目,什么也不返回。

1 个答案:

答案 0 :(得分:1)

是的,由于您需要通过添加add来解决elif方法中的错误,因此它会两次添加第一个数字:

def add(self, value):
   if self.head == None:
        new_node = Node(value)
        self.head = new_node
        self.tail = self.head
        # self.head.setNext(self.tail) ## remove to prevent infinity loop


    elif self.head.value > value:
        new_node = Node(value)
        new_node.value = value
        new_node.next = self.head
        self.head = new_node

    else:
        new_node = Node(value)
        self.tail.setNext(new_node)
        self.tail = new_node

因为,一旦添加数据后头None,那么下一个条件条件将始终在ifelse上执行两个部分之一。