python中的循环链表

时间:2010-12-05 17:13:18

标签: python

我无法在python中实现循环链​​接列表的add函数。我有一个头指针应该是一个节点的引用,但每次我添加一些东西到列表,头总是无。这是我到目前为止的代码:

class CircleList():

    __slots__ = ('head', 'size')

    def __init__(self):
        self.head = None
        self.size = 0

    def __str__(self):
        result = "<"
        node = self.head
        count = self.size
        while count != 0:
            result = result + str(node.data)
            if count != 1:
                result = result + ", "
            node = node.next
            count -= 1
        result = result + ">"
        return result

    def add(self, element):
        head = self.head
        print(head)
        size = self.size
        if head == None:
            head = Node(element, None)
            head.next = head
        else:
            cursor = head
            while cursor.next != head:
                cursor = cursor.next
            temp = Node(element, head)
            cursor.next = temp
        size += 1


class Node():
    __slots__ = ('data','next')

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

这是驱动程序:

stream = open('data.txt', 'r')

circlelist = CircleList()

for name in stream
    circlelist.add(name)

print(circlelist)

2 个答案:

答案 0 :(得分:1)

您只需将新节点分配到head方法中的本地add()变量,而不是实际的CircleList实例成员。

您可能想要执行以下操作:

def add(self, element):
    head = self.head
    print(head)
    size = self.size
    if head is None:
        self.head = head = Node(element, None)  # Also set the instance member.
        head.next = head

答案 1 :(得分:0)

易于修复!在你的add函数中,你将新的头部分配给head变量 - 这个变量仅限于函数的范围,并且在它返回时会消失!

您必须设置self.head的值,即当前实例的属性。

编辑:当您指定head = self.head时,它们都指向同一个对象。但它们是单独的引用:它们是否碰巧引用相同的东西,改变一个不会改变另一个。