Skip to content

Commit 2ec6195

Browse files
authored
Add files via upload
1 parent 3ca9ab7 commit 2ec6195

File tree

1 file changed

+197
-0
lines changed

1 file changed

+197
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
"""
2+
Remove duplicate elements from linkedlist
3+
4+
i/p:12->11->12->2->14->11->16->2->None
5+
o/p: 12->11->2->14->16
6+
7+
"""
8+
9+
10+
class Node():
11+
def __init__(self,data) -> None:
12+
self.data = data
13+
self.next = None
14+
15+
class simpleLL():
16+
def __init__(self) -> None:
17+
self.head =None
18+
self.size = 0
19+
20+
def __is_list_empty(self):
21+
"""
22+
while deleting we have to make sure that the list is empty. This function checks if the
23+
linked list is empty
24+
"""
25+
return self.head == None
26+
27+
def insert_at_end(self,data):
28+
"""
29+
function to insert a data at the end
30+
"""
31+
newnode = Node(data)
32+
if not self.__is_list_empty():
33+
p = self.head
34+
while p.next:
35+
p = p.next
36+
p.next = newnode
37+
else:
38+
self.head = newnode
39+
40+
self.size +=1
41+
42+
def insert_at_begin(self,data):
43+
"""
44+
function to insert a data at the begin
45+
"""
46+
newnode = Node(data)
47+
if not self.__is_list_empty():
48+
newnode.next = self.head
49+
self.head = newnode
50+
else:
51+
self.head = newnode
52+
self.size +=1
53+
54+
def insert_new_node_after_given_data(self,afterData,data):
55+
"""
56+
function to insert a new node after the data
57+
"""
58+
newnode = Node(data)
59+
if not self.__is_list_empty():
60+
p = self.head
61+
62+
while p and p.data !=afterData :
63+
p = p.next
64+
65+
if p == None:
66+
print("cant find data")
67+
else:
68+
if p.next:
69+
after = p.next
70+
newnode.next = after
71+
72+
p.next = newnode
73+
else:
74+
print("List empty")
75+
return
76+
self.size +=1
77+
78+
def delete_node(self,node):
79+
"""
80+
Delete given node
81+
82+
"""
83+
if node == self.head:
84+
#delete head node
85+
self.head = self.head.next
86+
elif node.next ==None:
87+
#last node
88+
p =self.head
89+
while p.next !=node:
90+
p= p.next
91+
92+
#make last second node point to None
93+
p.next = None
94+
else:
95+
#middle node
96+
p =self.head
97+
while p.next !=node:
98+
p =p.next
99+
p.next = node.next
100+
101+
self.size -=1
102+
103+
def show(self):
104+
p = self.head
105+
while p :
106+
print(p.data)
107+
p =p.next
108+
print("====================")
109+
110+
class remove_dups():
111+
def __init__(self,llobj) -> None:
112+
113+
self = llobj
114+
115+
116+
117+
def remove_dups_with_hash(self,lobj):
118+
"""
119+
Remove duplicate item in unsorted list using hash
120+
121+
Time: O(n)
122+
Space: O(N)
123+
"""
124+
self = lobj
125+
p = self.head
126+
hash = dict()
127+
while p :
128+
if p.data not in hash.keys():
129+
hash[p.data] = p.data
130+
else:
131+
self.delete_node(p)
132+
p = p.next
133+
134+
def remove_dups_with_two_pointers(self,lobj):
135+
"""
136+
Remove duplicate item in unsorted list using two pointer
137+
Time: O(n^2)
138+
Space: O(1)
139+
140+
141+
"""
142+
self = lobj
143+
144+
p1 = self.head
145+
if p1 == None or p1.next == None :
146+
return
147+
p2 =p1.next
148+
149+
while p1.next != None and p2.next !=None:
150+
if p1.data !=p2.data:
151+
p2 =p2.next
152+
else:
153+
#delete p2
154+
self.delete_node(p2)
155+
p1 = p1.next
156+
p2 = p1.next
157+
158+
159+
160+
161+
162+
163+
164+
lobj = simpleLL()
165+
lobj.insert_at_end(12)
166+
lobj.insert_at_end(11)
167+
lobj.insert_at_end(12)
168+
lobj.insert_at_end(2)
169+
lobj.insert_at_end(11)
170+
lobj.insert_at_end(16)
171+
lobj.insert_at_end(2)
172+
lobj.insert_new_node_after_given_data(2,14)
173+
174+
lobj.show()
175+
176+
robj = remove_dups(lobj)
177+
robj.remove_dups_with_hash(lobj)
178+
lobj.show()
179+
180+
robj.remove_dups_with_two_pointers(lobj)
181+
lobj.show()
182+
183+
184+
185+
186+
187+
188+
189+
190+
191+
192+
193+
194+
195+
196+
197+

0 commit comments

Comments
 (0)