-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathchap3_lnode.py
93 lines (77 loc) · 2.01 KB
/
chap3_lnode.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# -*- coding: utf-8 -*-
"""
单链表的实现
"""
import sys
class LinkedListUnderflow(ValueError):
pass
class LNode(object):
def __init__(self, elem, next_=None):
"""one node"""
self.elem = elem
self.next = next_
class LList(object):
def __init__(self):
self._head = None
def is_empty(self):
return self._head is None
def prepend(self, elem):
"""insert at head of llist"""
self._head = LNode(elem, self._head)
def pop(self):
if self._head is None:
raise LinkedListUnderflow('in pop')
e = self._head.elem
self._head = self._head.next
return e
def append(self, elem):
if self._head is None:
self._head = LNode(elem)
return
p = self._head
while p.next is not None:
p = p.next
p.next = LNode(elem)
def pop_last(self):
if self._head is None:
raise LinkedListUnderflow('in pop_last')
p = self._head
if p.next is None:
e = p.elem
self._head = None
return e
while p.next.next is not None:
p = p.next
e = p.next.elem
p.next = None
return e
def filter(self, pred):
p = self._head
while p is not None:
if pred(p.elem):
yield p.elem
p = p.next
def printall(self):
p = self._head
while p is not None:
# print(p.elem),
sys.stdout.write(unicode(p.elem))
if p.next is not None:
# print(', '),
sys.stdout.write(', ')
p = p.next
print('')
def elements(self):
p = self._head
while p:
yield p.elem
p = p.next
if __name__ == '__main__':
mlist1 = LList()
for i in range(10):
mlist1.prepend(i)
for i in range(11, 20):
mlist1.append(i)
mlist1.printall()
for i in mlist1.elements():
print i