#构造一个节点的类
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) == []