Python实现的循环链表,大佬们看看有啥问题没。

来源:5-7 更多和链表相关的问题

不务正业的码农

2018-08-02

# _*_coding:utf-8 _*_


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


class circularLinklist(object):
def __init__(self, maxsize=None):
self.maxsize = maxsize
node = Node()
node.next, node.prevf = node, node
self.root = node
self.length = 0

def __len__(self):
return self.length

def headnode(self):
return self.root.next

def tailnode(self):
return self.root.prev

def append(self, value):
if self.maxsize is not None and len(self) > self.maxsize:
raise Exception("the linked list is full")
node = Node(value=value)
tailnode = self.tailnode() or self.root
tailnode.next = node
node.prev = tailnode
node.next = self.root
self.root.prev = node
self.length += 1

def appendleft(self, value):
if self.maxsize is not None and len(self) > self.maxsize:
raise Exception("the linked list is full")
node = Node(value=value)

if self.root.next is self.root:  # 空表
node.next = self.root
node.prev = self.root
self.root.next = node
self.root.prev = node
else:
node.prev = self.root
headnode = self.root.next
node.next = headnode
headnode.prev = node
self.root.next = node
self.length += 1

def remove(self, node):
if node is self.root:
return
else:
node.prev.next = node.next
node.next.prev = node.prev
self.length -= 1
return node

def iter_node(self):
if self.root.next is self.root:  # 空链表
return
curnode = self.root.next
while curnode.next is not self.root:
yield curnode
curnode = curnode.next
yield curnode

def __iter__(self):
for node in self.iter_node():
yield node.value

def iter_node_reverse(self):
"""
        reverse loop
        """
if self.root.prev is self.root:
return
curnode = self.root.prev  # 尾节点
while curnode.prev is not self.root:
yield curnode
curnode = curnode.prev
yield curnode


if __name__ == '__main__':
dll = circularLinklist()
assert len(dll) == 0

dll.append(0)
dll.append(1)
dll.append(2)

assert list(dll) == [0, 1, 2]

assert [node.value for node in dll.iter_node()] == [0, 1, 2]
assert [node.value for node in dll.iter_node_reverse()] == [2, 1, 0]

headnode = dll.headnode()
assert headnode.value == 0
dll.remove(headnode)
assert len(dll) == 2
assert [node.value for node in dll.iter_node()] == [1, 2]

dll.appendleft(0)
assert [node.value for node in dll.iter_node()] == [0, 1, 2]
print("Your code is good by now!")

非常的蛋疼,Python转JAVA战线拉的太长,只能跟着课程 全程用Python实现。不知道有没有什么问题

写回答

1回答

liuyubobobo

2018-08-02

自己测试试试看?


一方面,可以自己设计测试用例。


另一方面,课程中的代码,我都会使用自己写的数据结构,包装成更高级的数据结构。比如用链表实现栈,之后用这个自己的数据结构,解决一个Leetcode上的问题,让Leetcode帮我测试:)


比如这个代码,就是我用自己实现的链表,包装了一个栈,之后去解决Leetcode上的一个和栈相关的问题。如果能够AC的话,至少,在这个栈结构中,你使用过的接口,基本上问题不大了:)


传送门:https://github.com/liuyubobobo/Play-with-Data-Structures/blob/master/04-Linked-List/06-Implement-Stack-in-LinkedList/src/Solution.java


加油!:)

1
3
liuyubobobo
回复
不务正业的码农
赞!常使用Python完成课程的所有代码,传到github上,我给你做推荐。在我的第一门课程《算法和数据结构》中,有同学用Python实现了课程的所有代码,现在已经有100+的star啦!传送门:https://github.com/ShiveryMoon/Imooc-Algorithm-PythonEdition 加油!:)
2018-08-03
共3条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程