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回答
-
自己测试试试看?
一方面,可以自己设计测试用例。
另一方面,课程中的代码,我都会使用自己写的数据结构,包装成更高级的数据结构。比如用链表实现栈,之后用这个自己的数据结构,解决一个Leetcode上的问题,让Leetcode帮我测试:)
比如这个代码,就是我用自己实现的链表,包装了一个栈,之后去解决Leetcode上的一个和栈相关的问题。如果能够AC的话,至少,在这个栈结构中,你使用过的接口,基本上问题不大了:)
加油!:)
132018-08-03
相似问题