Skip to content

Commit bda6792

Browse files
authored
Added Linked List files
new Circular LL, revised Doubly LL, revised LL
1 parent dd4759e commit bda6792

File tree

4 files changed

+473
-0
lines changed

4 files changed

+473
-0
lines changed

LinkedLists/CircularLinkedList.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
class Node(object):
2+
3+
def __init__ (self, d, n = None):
4+
self.data = d
5+
self.next_node = n
6+
7+
def get_next (self):
8+
return self.next_node
9+
10+
def set_next (self, n):
11+
self.next_node = n
12+
13+
def get_data (self):
14+
return self.data
15+
16+
def set_data (self, d):
17+
self.data = d
18+
19+
def to_string (self):
20+
return "Node value: " + str(self.data)
21+
22+
class CircularLinkedList (object):
23+
24+
def __init__ (self, r = None):
25+
self.root = r
26+
self.size = 0
27+
28+
def get_size (self):
29+
return self.size
30+
31+
def add (self, d):
32+
if self.get_size() == 0:
33+
self.root = Node(d)
34+
self.root.set_next(self.root)
35+
else:
36+
new_node = Node (d, self.root.get_next())
37+
self.root.set_next(new_node)
38+
self.size += 1
39+
40+
def remove (self, d):
41+
this_node = self.root
42+
prev_node = None
43+
44+
while True:
45+
if this_node.get_data() == d: # found
46+
if prev_node is not None:
47+
prev_node.set_next(this_node.get_next())
48+
else:
49+
while this_node.get_next() != self.root:
50+
this_node = this_node.get_next()
51+
this_node.set_next(self.root.get_next())
52+
self.root = self.root.get_next()
53+
self.size -= 1
54+
return True # data removed
55+
elif this_node.get_next() == self.root:
56+
return False # data not found
57+
prev_node = this_node
58+
this_node = this_node.get_next()
59+
60+
def find (self, d):
61+
this_node = self.root
62+
while True:
63+
if this_node.get_data() == d:
64+
return d
65+
elif this_node.get_next() == self.root:
66+
return False
67+
this_node = this_node.get_next()
68+
69+
def print_list (self):
70+
print ("Print List..........")
71+
if self.root is None:
72+
return
73+
this_node = self.root
74+
print (this_node.to_string())
75+
while this_node.get_next() != self.root:
76+
this_node = this_node.get_next()
77+
print (this_node.to_string())
78+
79+
def main():
80+
myList = CircularLinkedList()
81+
myList.add(5)
82+
myList.add(7)
83+
myList.add(3)
84+
myList.add(8)
85+
myList.add(9)
86+
print("Find 8", myList.find(8))
87+
print("Find 12", myList.find(12))
88+
89+
cur = myList.root
90+
print (cur.to_string())
91+
for i in range(8):
92+
cur = cur.get_next();
93+
print (cur.to_string())
94+
95+
print("size="+str(myList.get_size()))
96+
myList.print_list()
97+
myList.remove(8)
98+
print("size="+str(myList.get_size()))
99+
print("Remove 15", myList.remove(15))
100+
print("size="+str(myList.get_size()))
101+
myList.remove(5) # delete root node
102+
myList.print_list()
103+
104+
main()
105+
106+
107+
108+
109+
110+
111+
112+
113+
114+
115+
116+

LinkedLists/DoublyLinkedList2.py

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
class Node(object):
2+
3+
def __init__ (self, d, n = None, p = None):
4+
self.data = d
5+
self.next_node = n
6+
self.prev_node = p
7+
8+
def get_next (self):
9+
return self.next_node
10+
11+
def set_next (self, n):
12+
self.next_node = n
13+
14+
def get_prev (self):
15+
return self.prev_node
16+
17+
def set_prev (self, p):
18+
self.prev_node = p
19+
20+
def get_data (self):
21+
return self.data
22+
23+
def set_data (self, d):
24+
self.data = d
25+
26+
def to_string (self):
27+
return "Node value: " + str(self.data)
28+
29+
def has_next (self):
30+
if self.get_next() is None:
31+
return False
32+
return True
33+
34+
class DoublyLinkedList (object):
35+
36+
def __init__ (self, r = None):
37+
self.root = r
38+
self.last = r
39+
self.size = 0
40+
41+
def get_size (self):
42+
return self.size
43+
44+
def add (self, d):
45+
if self.size == 0:
46+
self.root = Node(d)
47+
self.last = self.root
48+
else:
49+
new_node = Node(d, self.root)
50+
self.root.set_prev(new_node)
51+
self.root = new_node
52+
self.size += 1
53+
54+
def remove (self, d):
55+
this_node = self.root
56+
while this_node is not None:
57+
if this_node.get_data() == d:
58+
if this_node.get_prev() is not None:
59+
if this_node.has_next(): # delete a middle node
60+
this_node.get_prev().set_next(this_node.get_next())
61+
this_node.get_next().set_prev(this_node.get_prev())
62+
else: # delete last node
63+
this_node.get_prev().set_next(None)
64+
self.last = this_node.get_prev()
65+
else: # delete root node
66+
self.root = this_node.get_next()
67+
this_node.get_next().set_prev(self.root)
68+
self.size -= 1
69+
return True # data removed
70+
else:
71+
this_node = this_node.get_next()
72+
return False # data not found
73+
74+
def find (self, d):
75+
this_node = self.root
76+
while this_node is not None:
77+
if this_node.get_data() == d:
78+
return d
79+
elif this_node.get_next() == self.root:
80+
return False
81+
else:
82+
this_node = this_node.get_next()
83+
84+
def print_list (self):
85+
print ("Print List..........")
86+
if self.root is None:
87+
return
88+
this_node = self.root
89+
print (this_node.to_string())
90+
while this_node.has_next():
91+
this_node = this_node.get_next()
92+
print (this_node.to_string())
93+
94+
def main():
95+
myList = DoublyLinkedList()
96+
myList.add(5)
97+
myList.add(9)
98+
myList.add(3)
99+
myList.add(8)
100+
myList.add(9)
101+
print("size="+str(myList.get_size()))
102+
myList.print_list()
103+
myList.remove(8)
104+
print("size="+str(myList.get_size()))
105+
print("Remove 15", myList.remove(15))
106+
myList.add(21)
107+
myList.add(22)
108+
myList.remove(5)
109+
myList.print_list()
110+
print("size="+str(myList.get_size()))
111+
print(myList.last.get_prev().to_string())
112+
113+
main()

LinkedLists/LinkedList1.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
class Node(object):
2+
3+
def __init__ (self, d, n = None):
4+
self.data = d
5+
self.next_node = n
6+
7+
def get_next (self):
8+
return self.next_node
9+
10+
def set_next (self, n):
11+
self.next_node = n
12+
13+
def get_data (self):
14+
return self.data
15+
16+
def set_data (self, d):
17+
self.data = d
18+
19+
def to_string (self):
20+
return "Node value: " + str(self.data);
21+
22+
def has_next (self):
23+
if self.get_next() is None:
24+
return False;
25+
return True;
26+
27+
def compare_to (self, y):
28+
if self.to_string() < y.to_string():
29+
return -1;
30+
elif self.to_string() > y.to_string():
31+
return 1;
32+
return 0;
33+
34+
35+
class LinkedList (object):
36+
37+
def __init__ (self, r = None):
38+
self.root = r
39+
self.size = 0
40+
41+
def get_size (self):
42+
return self.size
43+
44+
def add (self, d):
45+
new_node = Node (d, self.root);
46+
self.root = new_node;
47+
self.size += 1;
48+
49+
def add_node (self, n):
50+
n.set_next(self.root);
51+
self.root = n;
52+
self.size += 1;
53+
54+
def remove (self, d):
55+
this_node = self.root
56+
prev_node = None
57+
58+
while this_node:
59+
if this_node.get_data() == d:
60+
if prev_node: # removing node that is not the root
61+
prev_node.set_next(this_node.get_next())
62+
else: # removing root node
63+
self.root = this_node.get_next()
64+
self.size -= 1
65+
return True # data removed
66+
else:
67+
prev_node = this_node
68+
this_node = this_node.get_next()
69+
return False # data not found
70+
71+
def find (self, d):
72+
this_node = self.root
73+
while this_node:
74+
if this_node.get_data() == d:
75+
return d
76+
else:
77+
this_node = this_node.get_next()
78+
return None
79+
80+
def print_list (self):
81+
print ("Print List..........");
82+
if self.root is None:
83+
return;
84+
current = self.root;
85+
print (current.to_string());
86+
while current.has_next():
87+
current = current.get_next();
88+
print (current.to_string());
89+
90+
def sort (self):
91+
if self.size > 1:
92+
newlist = [];
93+
current = self.root;
94+
newlist.append(self.root);
95+
while current.has_next():
96+
current = current.get_next();
97+
newlist.append(current);
98+
newlist = sorted(newlist, key = lambda node: node.get_data(), reverse = True);
99+
newll = LinkedList();
100+
for node in newlist:
101+
newll.add_node(node);
102+
return newll;
103+
return self;
104+
105+
myList = LinkedList()
106+
myList.add(5)
107+
myList.add(9)
108+
myList.add(3)
109+
myList.add(8)
110+
myList.add(9)
111+
print("size="+str(myList.get_size()))
112+
myList.print_list();
113+
myList = myList.sort();
114+
myList.print_list();
115+
myList.remove(8)
116+
print("size="+str(myList.get_size()))
117+
print(myList.remove(12))
118+
print("size="+str(myList.get_size()))

0 commit comments

Comments
 (0)