-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinked Lists.py
More file actions
176 lines (151 loc) · 3.96 KB
/
Copy pathLinked Lists.py
File metadata and controls
176 lines (151 loc) · 3.96 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# Linked Lists------------------------------------------------------------------
# Node
class Node:
def __init__(self, value=None):
self.value = value
self.next = None
def traversal(self):
node = self
while node != None:
print(node.value)
node = node.next
# Wrapper
class List:
def __init__(self, head):
self.head = head
# Example Linked List
node1 = Node(7)
node2 = Node(1)
node3 = Node(6)
node4 = Node(2)
node1.next = node2
node2.next = node3
node3.next = node4
node1a = Node(5)
node2a = Node(9)
node3a = Node(2)
node4a = Node(9)
node1a.next = node2a
node2a.next = node3a
node3a.next = node4a
list1 = List(node1)
# CTCI questions
# 2.1 remove duplicated
def removeDup(node):
uniqueVals = []
currNode = node.next
prevNode = node
uniqueVals.append(prevNode.value)
while currNode != None:
if currNode.value in uniqueVals:
prevNode.next = currNode.next
else:
uniqueVals.append(currNode)
prevNode = prevNode.next
currNode = currNode.next
return node
#node1.traversal()
#node1 = removeDup(node1)
#print("post dup removal")
#node1.traversal()
# 2.2 Return K'th to last
def kth(node, k):
if k == 1:
return node.value
else:
return kth(node.next, k-1)
def size(node, k):
if node == None:
return k
else:
return size(node.next, k+1)
def kth_from_end(node, k):
length = size(node, 0)
return kth(node, (length-k+1))
node1.traversal()
#node1 = removeDup(node1)
print("length is", size(node1, 0))
print("3th is ", kth(node1, 3))
print("2nd from end", (kth_from_end(node1, 2)))
#node1.traversal()
# partition according to a pivot
def partition(node, pivot):
head = node
tail = node
while node != None:
next = node.next
if (node.value > pivot):
tail.next = node
tail = node
else:
node.next = head
head = node
node = next
tail.next = None
return head
#print("post partition")
#node1 = partition(node1, 50)
#node1.traversal()
# sum two integers in linked Lists
def sum_list(num1, num2):
sum_ll = Node(0)
head = sum_ll
carryover = 0
while ((num1 != None) or (num2 != None) or (carryover == 1)):
sum_val = carryover
if (num2 != None):
sum_val += num2.value
num2 = num2.next
if (num1 != None):
sum_val += num1.value
num1 = num1.next
carryover = 0
if sum_val > 9:
carryover += 1
sum_val -= 10
sum_ll.value = sum_val
sum_ll.next = Node()
sum_ll = sum_ll.next
return head
# print("node1")
# node1.traversal()
# print("node1a")
# node1a.traversal()
# print("sum")
#(sum_list(node1, node1a)).traversal()
# find intersection of two linked Lists
def intersection(node1, node2):
# find length of node1
head1 = node1
length1 = 0
while (node1.next != None):
length1 += 1
node1 = node1.next
# find length of node2
head2 = node2
length2 = 0
while (node2.next != None):
length2 += 1
node2 = node2.next
# basic intersection check
if node1 != node2:
return None
if length1 >= length2:
starting_point = length1 - length2
while (starting_point != 0):
head1 = head1.next
starting_point -= 1
else:
starting_point = length2 - length1
while (starting_point != 0):
head2 = head2.next
starting_point -= 1
# compare both nodes for equivalency
while (head1 != None):
if head1 == head2:
return head1
else:
head1= head1.next
head2= head2.next
return None
# print(intersection(node1, node1a))