Skip to content

Commit 0034cfa

Browse files
committed
Code files added
1 parent 57fb059 commit 0034cfa

22 files changed

+1372
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
class Node:
2+
def __init__(self, data=None):
3+
self.data = data
4+
self.next = None
5+
6+
class CircularList:
7+
def __init__(self, data=None):
8+
self.head = None
9+
self.tail = None
10+
self.size = 0
11+
12+
def clear(self):
13+
self.tail = None
14+
self.head = None
15+
16+
def append(self, data):
17+
node = Node(data)
18+
if self.head:
19+
self.head.next = node
20+
self.head = node
21+
else:
22+
self.head = node
23+
self.tail = node
24+
self.head.next = self.tail
25+
self.size += 1
26+
27+
def delete(self, data):
28+
current = self.tail
29+
prev = self.tail
30+
while prev == current or prev != self.head:
31+
if current.data == data:
32+
if current == self.tail:
33+
self.tail = current.next
34+
self.head.next = self.tail
35+
else:
36+
prev.next = current.next
37+
self.size -= 1
38+
return
39+
prev = current
40+
current = current.next
41+
42+
def iter(self):
43+
current = self.tail
44+
while current:
45+
val = current.data
46+
current = current.next
47+
yield val
48+
49+
words = CircularList()
50+
words.append('eggs')
51+
words.append('ham')
52+
words.append('spam')
53+
54+
counter = 0
55+
for word in words.iter():
56+
print(word)
57+
counter += 1
58+
if counter > 1000:
59+
break
60+
61+
import sys
62+
sys.exit()
63+
64+
l.append('foo')
65+
l.append('bar')
66+
l.append('bim')
67+
l.append('baz')
68+
l.append('quux')
69+
l.append('duux')
70+
71+
counter = 0
72+
for item in l.iter():
73+
print(item)
74+
counter += 1
75+
if counter > 1000:
76+
break
77+
78+
print("Done iterating. Now we try to delete something that isn't there.")
79+
l.delete('socks')
80+
print('back to iterating')
81+
counter = 0
82+
for item in l.iter():
83+
print(item)
84+
counter += 1
85+
if counter > 1000:
86+
break
87+
88+
print('Let us delete something that is there.')
89+
l.delete('foo')
90+
print('back to iterating')
91+
counter = 0
92+
for item in l.iter():
93+
print(item)
94+
counter += 1
95+
if counter > 1000:
96+
break

Chapter04/doubly_linked_list.py

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
class Node(object):
2+
""" A Doubly-linked lists' node. """
3+
def __init__(self, data=None, next=None, prev=None):
4+
self.data = data
5+
self.next = next
6+
self.prev = prev
7+
8+
9+
class DoublyLinkedList(object):
10+
def __init__(self):
11+
self.head = None
12+
self.tail = None
13+
self.count = 0
14+
15+
def append(self, data):
16+
""" Append an item to the list. """
17+
18+
new_node = Node(data, None, None)
19+
if self.head is None:
20+
self.head = new_node
21+
self.tail = self.head
22+
else:
23+
new_node.prev = self.tail
24+
self.tail.next = new_node
25+
self.tail = new_node
26+
27+
self.count += 1
28+
29+
def iter(self):
30+
""" Iterate through the list. """
31+
current = self.head #note subtle change
32+
while current:
33+
val = current.data
34+
current = current.next
35+
yield val
36+
37+
def reverse_iter(self):
38+
""" Iterate backwards through the list. """
39+
current = self.tail
40+
while current:
41+
val = current.data
42+
current = current.prev
43+
yield val
44+
45+
def delete(self, data):
46+
""" Delete a node from the list. """
47+
current = self.head
48+
node_deleted = False
49+
if current is None:
50+
node_deleted = False
51+
52+
elif current.data == data:
53+
self.head = current.next
54+
self.head.prev = None
55+
node_deleted = True
56+
57+
elif self.tail.data == data:
58+
self.tail = self.tail.prev
59+
self.tail.next = None
60+
node_deleted = True
61+
62+
else:
63+
while current:
64+
if current.data == data:
65+
current.prev.next = current.next
66+
current.next.prev = current.prev
67+
node_deleted = True
68+
current = current.next
69+
70+
if node_deleted:
71+
self.count -= 1
72+
73+
def search(self, data):
74+
"""Search through the list. Return True if data is found, otherwise False."""
75+
for node in self.iter():
76+
if data == node:
77+
return True
78+
return False
79+
80+
def print_foward(self):
81+
""" Print nodes in list from first node inserted to the last . """
82+
for node in self.iter():
83+
print(node)
84+
85+
def print_backward(self):
86+
""" Print nodes in list from latest to first node. """
87+
current = self.tail
88+
while current:
89+
print(current.data)
90+
current = current.prev
91+
92+
def insert_head(self, data):
93+
""" Insert new node at the head of linked list. """
94+
95+
if self.head is not None:
96+
new_node = Node(data, None, None)
97+
new_node.next = self.head
98+
self.head.prev = new_node
99+
self.head = new_node
100+
self.count += 1
101+
102+
def reverse(self):
103+
""" Reverse linked list. """
104+
current = self.head
105+
while current:
106+
temp = current.next
107+
current.next = current.prev
108+
current.prev = temp
109+
current = current.prev
110+
111+
# Now reverse the order of head and tail
112+
temp = self.head
113+
self.head = self.tail
114+
self.tail = temp
115+
116+
def __getitem__(self, index):
117+
if index > self.count - 1:
118+
raise Exception("Index out of range.")
119+
current = self.head # Note subtle change
120+
for n in range(index):
121+
current = current.next
122+
return current.data
123+
124+
def __setitem__(self, index, value):
125+
if index > self.count - 1:
126+
raise Exception("Index out of range.")
127+
current = self.head # Note subtle change
128+
for n in range(index):
129+
current = current.next
130+
current.data = value
131+
132+
133+
dll = DoublyLinkedList()
134+
dll.append("foo")
135+
dll.append("bar")
136+
dll.append("biz")
137+
dll.append("whew")
138+
print("Items in List : ")
139+
dll.print_foward()
140+
print("List after deleting node with data whew")
141+
dll.delete("whew")
142+
dll.print_foward()
143+
144+
print("List count: {}".format(dll.count))
145+
print("Print list backwards")
146+
dll.print_backward()
147+
148+
print("Reverse list ")
149+
dll.reverse()
150+
dll.print_foward()
151+
152+
print("Append item to front of list")
153+
dll.insert_head(55)
154+
dll.print_foward()
155+
156+
print("Get First element: {}".format(dll[0]))

Chapter04/singly_linked_list.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
class Node:
2+
""" A singly-linked node. """
3+
def __init__(self, data=None):
4+
self.data = data
5+
self.next = None
6+
7+
class SinglyLinkedList:
8+
""" A singly-linked list. """
9+
def __init__(self):
10+
""" Create an empty list. """
11+
self.tail = None
12+
self.head = None
13+
self.count = 0
14+
15+
def iter(self):
16+
""" Iterate through the list. """
17+
current = self.tail
18+
while current:
19+
val = current.data
20+
current = current.next
21+
yield val
22+
23+
def append(self, data):
24+
""" Append an item to the list """
25+
node = Node(data)
26+
if self.head:
27+
self.head.next = node
28+
self.head = node
29+
else:
30+
self.tail = node
31+
self.head = node
32+
self.count += 1
33+
34+
def delete(self, data):
35+
""" Delete a node from the list """
36+
current = self.tail
37+
prev = self.tail
38+
while current:
39+
if current.data == data:
40+
if current == self.tail:
41+
self.tail = current.next
42+
else:
43+
prev.next = current.next
44+
self.count -= 1
45+
return
46+
prev = current
47+
current = current.next
48+
49+
def search(self, data):
50+
""" Search through the list. Return True if data is found, otherwise
51+
False. """
52+
for node in self.iter():
53+
if data == node:
54+
return True
55+
return False
56+
57+
def __getitem__(self, index):
58+
if index > self.count - 1:
59+
raise Exception("Index out of range.")
60+
current = self.tail
61+
for n in range(index):
62+
current = current.next
63+
return current.data
64+
65+
def __setitem__(self, index, value):
66+
if index > self.count - 1:
67+
raise Exception("Index out of range.")
68+
current = self.tail
69+
for n in range(index):
70+
current = current.next
71+
current.data = value
72+
73+
words = SinglyLinkedList()
74+
words.append('foo')
75+
words.append('bar')
76+
words.append('bim')
77+
words.append('baz')
78+
words.append('quux')
79+
80+
print("access by index")
81+
print("here is a node: {}".format(words[1]))
82+
83+
print("modify by index")
84+
words[4] = "Quux"
85+
print("Modified node by index: {}".format(words[4]))
86+
87+
print("This list has {} elements.".format(words.count))
88+
for word in words.iter():
89+
print("Got this data: {}".format(word))
90+
91+
if words.search('foo'):
92+
print("Found foo in the list.")
93+
if words.search('amiga'):
94+
print("Found amiga in the list.")
95+
96+
print("Now we try to delete an item")
97+
words.delete('bim')
98+
print("List now has {} elements".format(words.count))
99+
for word in words.iter():
100+
print("data: {}".format(word))
101+
102+
print("delete the first item in the list")
103+
words.delete('foo')
104+
print("size: {}".format(words.count))
105+
for word in words.iter():
106+
print("data: {}".format(word))
107+
108+
print("delete the last item in the list")
109+
words.delete('quux')
110+
print("size: {}".format(words.count))
111+
for word in words.iter():
112+
print("data: {}".format(word))

0 commit comments

Comments
 (0)