链表Python

时间:2018-10-08 16:08:14

标签: python python-3.x python-2.7 linked-list singly-linked-list

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

class LinkedList:
    def __init__(self):
        self.head = None

    def __len__(self):
        cur = self.head
        count = 0
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def append(self, item):
        cur = self.head
        while cur is not None:
            cur = cur.next
        cur.next = ?

我正在尝试附加到链表中,但是我不能使用“ cur.next”,因为cur没有属性“ next”。有任何提示吗?

谢谢!

我的测试用例:

def test_append_empty() -> None:
    lst = LinkedList()
    lst.append(1)
    assert lst.head.data == 1


def test_append_one() -> None:
    lst = LinkedList()
    lst.head = Node(1)
    lst.append(2)
    assert lst.head.next.data == 2

2 个答案:

答案 0 :(得分:0)

您必须查找self.headNone时的情况,因为Nonetype接下来将没有属性。还进行迭代,直到在节点中找到下一个指针为“无”为止。因此,应该使用cur.next is not None而不是cur is None来确定节点是否为None。从逻辑上讲,您不能在None

后面添加任何内容
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def __len__(self):
        if not self.head:
            return 0
        cur = self.head
        count = 0
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def append(self, item):
        if not self.head:
            self.head=Node(item)
            return
        cur = self.head
        while cur.next is not None:
            cur = cur.next
        cur.next = Node(item)

测试用例1

l=LinkedList()
l.append(1)
l.__len__() #prints 1

测试用例2

l=LinkedList()
l.append(2)
l.append(3)
l.__len__() #2

temp=l.head
while(temp):
    print(temp.data)
    temp=temp.next

还包括OP的测试用例

def test_append_empty():
    lst = LinkedList()
    lst.append(1)
    print(lst.head.data == 1)


def test_append_one():
    lst = LinkedList()
    lst.head = Node(1)
    lst.append(2)
    print(lst.head.next.data == 2)

test_append_empty() #True
test_append_one() #True

答案 1 :(得分:0)

我希望通过mad_的清晰示例,您已经理解了仍然需要处理节点这一概念的想法。

链接列表不仅是值列表,而且还是链接列表。

由于您似乎有兴趣在一堂课中进行学习,因此可以快速实现:

class LinkedList:
    def __init__(self, item=None):
        self.next = None
        self.val = item

    def __len__(self):
        cur = self
        count = 1 if self.val is not None else 0
        while cur.next is not None:
            count += 1
            cur = cur.next
        return count    

    def append(self, item):
        if not self.val:
            self.val = item
            return

        cur = self
        while cur.next is not None:
            cur = cur.next
        cur.next = LinkedList(item)

编辑:

由于您在问题中加入了mad_的 len ()成员,因此我也添加了一个适合该班级的成员。

这是一些用法示例:

myList = LinkedList()
myList.append('a')
myList.append('b')
myList.append('c')
myList.append('d')
print(len(myList))