-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTwoWayLinkedList.py
145 lines (134 loc) · 3.85 KB
/
TwoWayLinkedList.py
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
# With Head and Tail
class TwoWayLinkedList:
class Element:
def __init__(self, val):
self.value = val
self.next = None
self.previous = None
def __init__(self):
self.head = None
self.tail = None
def push(self, val):
if self.head is None:
newElem = self.Element(val)
self.head = newElem
self.tail = newElem
else:
newElem = self.Element(val)
self.tail.next = newElem
newElem.previous = self.tail
self.tail = newElem
def print_list(self):
elem = self.head
if elem is None:
return
else:
while elem != self.tail:
print(elem.value)
elem = elem.next
print(self.tail.value)
def print_reverse(self):
elem = self.tail
if elem is None:
return
else:
while elem != self.head:
print(elem.value)
elem = elem.previous
print(self.head.value)
def pop(self):
elem = self.tail
if elem is None:
return None
else:
newTail = elem.previous
val = elem.value
self.tail = newTail
return val
def contains(self, val):
elem = self.head
if elem is None:
return False
else:
while elem:
if elem.value == val:
return True
else:
elem = elem.next
return False
def length(self):
count = 0
elem = self.head
if elem is None:
return 0
else:
while elem:
count += 1
elem = elem.next
return count
def add(self, val, index):
if index < 0 or index >= self.length():
return None
else:
if index == 0:
elem = self.head
newElem = self.Element(val)
newElem.next = elem
elem.previous = newElem
self.head = newElem
return
else:
elem = self.head
ind = 1
while ind != index:
ind += 1
elem = elem.next
newElem = self.Element(val)
if elem.next:
newElem.next = elem.next
newElem.previous = elem
elem.next.previous = newElem
elem.next = newElem
else:
newElem.next = None
newElem.previous = elem
elem.next = newElem
def remove(self, index):
if index < 0 or index >= self.length():
return None
else:
if index == 0:
elem = self.head
val = elem.value
self.head = elem.next
if self.head is None:
self.tail = None
return val
else:
elem = self.head
ind = 0
while ind != index:
ind += 1
elem = elem.next
if self.tail != elem:
val = elem.value
elem.previous.next = elem.next
elem.next.previous = elem.previous
return val
else:
val = elem.value
elem.previous.next = None
self.tail = elem.previous
return val
if __name__ == "__main__":
x = TwoWayLinkedList()
x.push(3)
x.push(69)
x.push(2137)
print(x.contains(69))
print(x.length())
x.print_list()
x.add(32, 1)
x.print_list()
x.remove(3)
x.print_list()