Skip to content

Commit dd40249

Browse files
authored
Merge pull request #12 from nickolasteixeira/chapter2
remove duplicate nodes, singly linked list
2 parents de29f3b + 8523aac commit dd40249

File tree

3 files changed

+336
-0
lines changed

3 files changed

+336
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#!/usr/bin/python3
2+
import unittest
3+
4+
5+
class Node:
6+
def __init__(self, data, next=None):
7+
self.data = data
8+
self.next = next
9+
10+
def __str__(self):
11+
return str(self.data)
12+
13+
14+
class SinglyLinkedList:
15+
16+
def __init__(self):
17+
self.head = None
18+
self.size = 0
19+
20+
def insertHead(self, data):
21+
print('Inserting head!----->', data)
22+
n = Node(data)
23+
temp = self.head
24+
self.head = n
25+
self.head.next = temp
26+
27+
def addNode(self, data):
28+
if not self.head:
29+
n = Node(data)
30+
self.head = n
31+
else:
32+
n = self.head
33+
while (n.next):
34+
n = n.next
35+
36+
print('New Node added ---->', data)
37+
new_node = Node(data)
38+
n.next = new_node
39+
40+
def removeDuplicates(self):
41+
print('Removing Duplicates.')
42+
temp = self.head
43+
nums = set()
44+
while temp.next:
45+
nums.add(temp.data)
46+
if temp.next.data in nums:
47+
temp.next = temp.next.next
48+
temp = temp.next
49+
print('Duplicates Removed!---------')
50+
51+
def removeDuplicatesNoBuffer(self):
52+
print('Removing Duplicates - No buffer')
53+
temp = self.head
54+
while temp.next:
55+
second = temp
56+
while second.next:
57+
if second.data == second.next.data:
58+
second.next = second.next.next
59+
second = second.next
60+
temp = temp.next
61+
print('Duplicates Removed!----------')
62+
63+
def printList(self):
64+
n = self.head
65+
66+
print('Printing Singly Linked List')
67+
while(n):
68+
print(n)
69+
n = n.next
70+
71+
72+
class Test(unittest.TestCase):
73+
@classmethod
74+
def setUpClass(cls):
75+
cls.link = SinglyLinkedList()
76+
cls.link.addNode(-1)
77+
cls.link.addNode(-1)
78+
cls.link.addNode(4)
79+
cls.link.addNode(3)
80+
cls.link.addNode(4)
81+
cls.link.addNode(1)
82+
cls.link.addNode(20)
83+
cls.link.addNode(4)
84+
cls.link.addNode(4)
85+
86+
@classmethod
87+
def tearDownClass(cls):
88+
print('---Teardown successful---')
89+
90+
def test1(self):
91+
self.link.printList()
92+
93+
def test2(self):
94+
self.link.removeDuplicates()
95+
self.link.printList()
96+
97+
def test3(self):
98+
self.link.addNode(-1)
99+
self.link.addNode(20)
100+
self.link.addNode(40)
101+
self.link.printList()
102+
self.link.removeDuplicatesNoBuffer()
103+
self.link.printList()
104+
105+
def test4(self):
106+
self.link.insertHead(-2)
107+
self.link.printList()
108+
109+
110+
if __name__ == "__main__":
111+
unittest.main()
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#!/usr/bin/python3
2+
'''
3+
Return Kth to Last: Implement an algorithm to
4+
find the kth to last element of a singly linked list.
5+
'''
6+
import unittest
7+
8+
9+
class Node:
10+
def __init__(self, data, next=None):
11+
self.data = data
12+
self.next = next
13+
14+
def __str__(self):
15+
return str(self.data)
16+
17+
18+
class SinglyLinkedList:
19+
20+
def __init__(self):
21+
self.head = None
22+
self.size = 0
23+
24+
def insertHead(self, data):
25+
print('Inserting head!----->', data)
26+
n = Node(data)
27+
temp = self.head
28+
self.head = n
29+
self.head.next = temp
30+
31+
def addNode(self, data):
32+
if not self.head:
33+
n = Node(data)
34+
print('New Head added ---->', data)
35+
self.head = n
36+
else:
37+
n = self.head
38+
while (n.next):
39+
n = n.next
40+
41+
print('New Node added ---->', data)
42+
new_node = Node(data)
43+
n.next = new_node
44+
45+
def kthToLastElement(self, num):
46+
if num < 1:
47+
print('Must be a positive number')
48+
return
49+
50+
length = 0
51+
temp = self.head
52+
while temp:
53+
length += 1
54+
temp = temp.next
55+
56+
if num > length:
57+
print('Input number cannot be larger than number of nodes')
58+
else:
59+
temp = self.head
60+
for x in range(length - num):
61+
temp = temp.next
62+
63+
print("{}th to last element --->".format(num), temp.data)
64+
65+
def printList(self):
66+
n = self.head
67+
68+
print('Printing Singly Linked List')
69+
while(n):
70+
print(n)
71+
n = n.next
72+
73+
74+
class Test(unittest.TestCase):
75+
@classmethod
76+
def setUpClass(cls):
77+
cls.link = SinglyLinkedList()
78+
cls.link.addNode(-1)
79+
cls.link.addNode(-1)
80+
cls.link.addNode(4)
81+
cls.link.addNode(3)
82+
cls.link.addNode(4)
83+
cls.link.addNode(1)
84+
cls.link.addNode(20)
85+
cls.link.addNode(4)
86+
cls.link.addNode(4)
87+
88+
@classmethod
89+
def tearDownClass(cls):
90+
print('---Teardown successful---')
91+
92+
def test1(self):
93+
self.link.printList()
94+
95+
def test2(self):
96+
self.link.kthToLastElement(0)
97+
self.link.kthToLastElement(1)
98+
self.link.kthToLastElement(2)
99+
self.link.kthToLastElement(3)
100+
self.link.kthToLastElement(9)
101+
self.link.kthToLastElement(10)
102+
103+
104+
if __name__ == "__main__":
105+
unittest.main()
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#!/usr/bin/python3
2+
import unittest
3+
from random import randint
4+
'''
5+
Delete Middle Node: Implement an algorithm to delete a node in the middle (i.e., any node but the first and last node, not necessarily the exact middle) of a singly linked list, given only access to that node. EXAMPLE lnput:the node c from the linked lista->b->c->d->e->f Result: nothing is returned, but the new linked list looks like a->b->d->e->f Hints:#72
6+
'''
7+
8+
'''
9+
Get clarification on this question:
10+
1. Will I always know that I will get a middle node? (non end or head node)
11+
2. What if the node is only 2 lengths long?
12+
3. What input will I get?
13+
'''
14+
15+
16+
class Node:
17+
def __init__(self, data, next=None):
18+
self.data = data
19+
self.next = next
20+
21+
def __str__(self):
22+
return str(self.data)
23+
24+
25+
class SinglyLinkedList:
26+
def __init__(self):
27+
self.head = None
28+
29+
def addNode(self, data):
30+
# adds node to head if no head
31+
node = Node(data)
32+
if not self.head:
33+
self.head = node
34+
# adds to end of linked list
35+
else:
36+
temp = self.head
37+
while temp.next:
38+
temp = temp.next
39+
temp.next = node
40+
41+
def printList(self):
42+
if self.head is None:
43+
print('Nothing to print')
44+
return
45+
46+
temp = self.head
47+
while temp:
48+
print(temp.data)
49+
temp = temp.next
50+
51+
def findSize(self):
52+
if self.head is None:
53+
print('Nothing to find the size of')
54+
return
55+
56+
temp = self.head
57+
count = 0
58+
while temp:
59+
count += 1
60+
temp = temp.next
61+
return count
62+
63+
def findMiddleNode(self):
64+
size = self.findSize()
65+
if size and size > 2:
66+
# cannot be the size of the node (tail) or the first node (head)
67+
temp = self.head
68+
randomNum = randint(2, size - 1)
69+
for x in range(1, randomNum):
70+
temp = temp.next
71+
return temp
72+
else:
73+
print("Not able to access a non head or tail node")
74+
return None
75+
76+
def deleteMiddleNode(self, node):
77+
'''The solution is simply to copy the data
78+
from the next node over to the current node,
79+
and then to delete the next node.
80+
'''
81+
if node is None:
82+
print('No node to delete')
83+
return
84+
85+
temp = node.next
86+
node.data = temp.data
87+
node.next = temp.next
88+
del temp
89+
90+
91+
class Test(unittest.TestCase):
92+
93+
@classmethod
94+
def setUpClass(cls):
95+
cls.l = SinglyLinkedList()
96+
cls.l.addNode(-1)
97+
cls.l.addNode(3)
98+
cls.l.addNode('hello')
99+
cls.l.addNode(100)
100+
cls.l.addNode(5)
101+
cls.l.printList()
102+
103+
@classmethod
104+
def tearDownClass(self):
105+
pass
106+
107+
def test1(self):
108+
numNodes = self.l.findSize()
109+
print('Number of nodes {}'.format(numNodes))
110+
111+
def test2(self):
112+
node = self.l.findMiddleNode()
113+
print('Middle node -->', node.data)
114+
print('Deleting middle node')
115+
self.l.deleteMiddleNode(node)
116+
self.l.printList()
117+
118+
119+
if __name__ == '__main__':
120+
unittest.main()

0 commit comments

Comments
 (0)