python 实现单链表 Lined List

#构造一个节点的类
1
class Node(object):
2 def __init__(self, value=None): 3 self.value = value 4 self.next = None 5 6 class LinkedList(object): 7 8 def __init__(self, root=None, maxsize=None):
#留一个尾节点是为了方便插入元素这样能实现O(1)时间的插入操作
9 self.tailnode = None 10 self.root = Node() 11 self.count = 0
#可以自己设定Linked List最大能存多少元素
12 self.maxsize = maxsize 13 14 def __len__(self): 15 return self.count 16 17 def append(self, value): 18 node = Node(value)
        #插入第一个值时
19 if self.tailnode is None: 20 self.root.next = node 21 else: 22 if self.maxsize and len(self) >= self.maxsize: 23 raise Exception('LinkedList is Full') 24 self.tailnode.next = node 25 self.tailnode = node 26 self.count += 1 27 28 def appendleft(self, value): 29 if self.maxsize and len(self) >= self.maxsize: 30 raise Exception('LinedList Full') 31 node = Node(value)
        #可能在插入之前这个单链表是空的因此要处理self.root和self.tailnode
32 if self.tailnode is None: 33 self.root.next = node 34 self.tailnode = node 35 else: 36 headnode = self.root.next 37 self.root.next = node 38 node.next = headnode 39 self.count += 1 40 41 def __iter__(self): 42 for node in self.iter_node(): 43 yield node.value 44 45 def iter_node(self): 46 headnode = self.root.next 47 while headnode: 48 yield headnode 49 headnode = headnode.next 50 51 def remove(self, value): 52 prevnode = self.root 53 for node in self.iter_node(): 54 if node.value == value: 55 prevnode.next = node.next 56 self.count -= 1 57 if node is self.tailnode: 58 self.tailnode = prevnode 59 del node 60 return 1 61 prevnode = node 62 return -1 63 64 def find(self, value): 65 for index, node in enumerate(self.iter_node()): 66 if node.value == value: 67 return index 68 return -1 69 70 def popleft(self): 71 if self.tailnode is None: 72 raise Exception("pop from empty LinkedList") 73 headnode = self.root.next 74 value = headnode.value 75 if headnode is self.tailnode: 76 self.tailnode = None 77 else: 78 self.root.next = headnode.next 79 del headnode 80 self.count -= 1 81 return value 82 83 def clear(self): 84 for node in self.iter_node(): 85 del node 86 self.root = Node() 87 self.tailnode = None 88 self.count = 0 89 90 def reverse(self): 91 prevnode = self.root.next 92 self.tailnode = prevnode 93 curnode = prevnode.next 94 prevnode.next = None 95 while curnode: 96 nextnode = curnode.next 97 curnode.next = prevnode 98 if nextnode is None: 99 self.root.next = curnode 100 prevnode = curnode 101 curnode = nextnode 102 if __name__ == "__main__": 103 l = LinkedList() 104 l.append(1) 105 l.append(2) 106 l.append(3) 107 assert len(l) == 3 108 assert list(l) == [1, 2, 3] 109 l.appendleft(0) 110 assert list(l) == [0, 1, 2, 3] 111 assert len(l) == 4 112 l.remove(2) 113 assert list(l) == [0, 1, 3] 114 assert l.popleft() == 0 115 l.append('a') 116 l.append('b') 117 l.reverse() 118 assert list(l) == ['b', 'a', 3, 1] 119 l.clear() 120 assert len(l) == 0 121 assert list(l) == []

猜你喜欢

转载自www.cnblogs.com/python-zkp/p/10544438.html