-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdoubly_linked_list.py
More file actions
140 lines (129 loc) · 3.78 KB
/
doubly_linked_list.py
File metadata and controls
140 lines (129 loc) · 3.78 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
class Node():
def __init__(self, value):
self.value = value
self.next = None
self.prev = None
class DoublyLinkedList():
def __init__(self, value):
new_node = Node(value)
self.head = new_node
self.tail = new_node
self.length = 1
def display(self):
temp = self.head
while temp is not None:
print(temp.value)
temp = temp.next
def append(self, value):
new_node = Node(value)
if self.length == 0:
self.head = self.tail = new_node
self.length += 1
return True
else:
new_node.prev = self.tail
self.tail.next = new_node
self.tail = new_node
self.length += 1
return True
def pop(self):
if self.length == 0:
return None
elif self.length == 1:
temp = self.head
self.head = self.tail = None
self.length -= 1
return temp.value
else:
temp = self.tail
self.tail = self.tail.prev
self.tail.next = None
temp.prev = None
self.length -= 1
return temp.value
def prepend(self, value):
new_node = Node(value)
if self.length == 0:
self.head = self.tail = new_node
self.length += 1
return True
else:
new_node.next = self.head
self.head.prev = new_node
self.head = new_node
self.head.prev = None
self.length += 1
return True
def pop_first(self):
if self.length == 0:
return None
elif self.length == 1:
temp = self.head
self.head = self.tail = None
self.length -= 1
return temp.value
else:
temp = self.head
self.head = self.head.next
temp.next = None
temp.prev = None
self.head.prev = None
self.length -= 1
return temp.value
def get_node(self, index):
if index < 0 or index >= self.length:
return None
else:
temp = self.head
for _ in range(index):
temp = temp.next
return temp
def set_value(self, index, value):
temp = self.get_node(index)
if index is None:
return False
elif index is not None:
temp.value = value
return True
else:
return False
def insert(self, index, value):
new_node = Node(value)
if self.length == 0:
return False
elif index < 0 or index > self.length:
return False
elif index == 0:
return self.prepend(value)
elif index == self.length:
return self.append(value)
else:
before = self.get_node(index - 1)
after = before.next
new_node.prev = before
new_node.next = after
before.next = new_node
after.prev = new_node
self.length += 1
return True
def remove(self, index):
if self.length == 0:
return None
elif index < 0 or index >= self.length:
return None
elif index == 0:
return self.pop_first()
elif index == self.length - 1:
return self.pop()
else:
temp = self.get_node(index)
if temp is None:
return None
else:
temp.next.pre = temp.prev
temp.prev.next = temp.next
temp.next = None
temp.prev = None
self.length -= 1
return temp.value
d1 = DoublyLinkedList(0)