1 class Link:
2 class Node:
3 def __init__(self, item, next=None):
4 self.item = item
5 self.next = next
6
7 class LinkListIterator:
8 def __init__(self, node):
9 self.node = node
10
11 def __next__(self):
12 if self.node:
13 cur_node = self.node
14 self.node = self.node.next
15 return cur_node.item
16 else:
17 raise StopIteration
18
19 def __iter__(self):
20 pass
21
22 def __init__(self, iterable=None):
23 self.head = None
24 self.tail = None
25 self.size = 0
26 if iterable:
27 self.extend(iterable)
28
29 def ins_head(self, item):
30 new_node = Link.Node(item, None)
31 if self.size == 0:
32 self.tail = new_node
33 else:
34 new_node.next = self.head
35 self.head = new_node
36 self.size += 1
37
38 def ins_tail(self, item):
39 new_node = Link.Node(item, None)
40 if self.size == 0:
41 self.head = new_node
42 else:
43 self.tail.next = new_node
44 self.tail = new_node
45 self.size += 1
46
47 def print_link(self):
48 for i in self:
49 print(i, end=' ')
50 print()
51
52 def del_head(self):
53 if self.size > 0:
54 temp = self.head
55 self.head = self.head.next
56 self.size -= 1
57 return temp
58 else:
59 raise IndexError
60
61 def del_item(self, item):
62 if self.size > 0:
63 cur_node = self.head
64 if self.size == 1:
65 if cur_node.item == item:
66 self.head = None
67 self.size -= 1
68 return cur_node.item
69 else:
70 for i in range(self.size):
71 if cur_node.next and cur_node.next.item == item:
72 temp = cur_node.next
73 cur_node.next = cur_node.next.next
74 self.size -= 1
75 return temp.item
76 cur_node = cur_node.next
77 else:
78 print('找不到要删除的元素')
79 return None
80 else:
81 raise IndexError
82
83 def find(self, item):
84 for i in self:
85 if i == item:
86 return True
87 else:
88 return False
89
90 def extend(self, iterable):
91 for i in iterable:
92 self.ins_tail(i)
93
94 def __iter__(self):
95 return self.LinkListIterator(self.head)
96
97 def __str__(self):
98 return '<<' + ','.join(map(str, self)) + '>>'
99
100 __repr__ = __str__
101
102
103 if __name__ == '__main__':
104 link = Link(['a', 'b', 'c'])
105 link.ins_head(1)
106 link.ins_head(2)
107 link.ins_head(3)
108 link.print_link()
109 link.ins_tail(4)
110 link.ins_tail(5)
111 link.ins_tail(6)
112 link.print_link()
113 print('-------------')
114 print('--', link.del_item(5))
115 print(link)