7
7
4. remove from the end -> O(1)
8
8
"""
9
9
10
+
10
11
class _DoublyLinkedBase :
11
12
""" A Private class (to be inherited) """
13
+
12
14
class _Node :
13
- __slots__ = '_prev' , '_data' , '_next'
15
+ __slots__ = "_prev" , "_data" , "_next"
16
+
14
17
def __init__ (self , link_p , element , link_n ):
15
18
self ._prev = link_p
16
19
self ._data = element
17
20
self ._next = link_n
18
-
21
+
19
22
def has_next_and_prev (self ):
20
- return " Prev -> {0}, Next -> {1}" .format (self ._prev != None , self ._next != None )
21
-
23
+ return " Prev -> {0}, Next -> {1}" .format (
24
+ self ._prev != None , self ._next != None
25
+ )
26
+
22
27
def __init__ (self ):
23
28
self ._header = self ._Node (None , None , None )
24
29
self ._trailer = self ._Node (None , None , None )
25
30
self ._header ._next = self ._trailer
26
31
self ._trailer ._prev = self ._header
27
32
self ._size = 0
28
-
33
+
29
34
def __len__ (self ):
30
35
return self ._size
31
-
36
+
32
37
def is_empty (self ):
33
38
return self .__len__ () == 0
34
-
39
+
35
40
def _insert (self , predecessor , e , successor ):
36
41
# Create new_node by setting it's prev.link -> header
37
42
# setting it's next.link -> trailer
@@ -40,11 +45,11 @@ def _insert(self, predecessor, e, successor):
40
45
successor ._prev = new_node
41
46
self ._size += 1
42
47
return self
43
-
48
+
44
49
def _delete (self , node ):
45
50
predecessor = node ._prev
46
51
successor = node ._next
47
-
52
+
48
53
predecessor ._next = successor
49
54
successor ._prev = predecessor
50
55
self ._size -= 1
@@ -53,20 +58,20 @@ def _delete(self, node):
53
58
del node
54
59
return temp
55
60
61
+
56
62
class LinkedDeque (_DoublyLinkedBase ):
57
-
58
63
def first (self ):
59
64
""" return first element
60
65
>>> d = LinkedDeque()
61
66
>>> d.add_first('A').first()
62
67
'A'
63
68
>>> d.add_first('B').first()
64
69
'B'
65
- """
70
+ """
66
71
if self .is_empty ():
67
- raise Exception (' List is empty' )
72
+ raise Exception (" List is empty" )
68
73
return self ._header ._next ._data
69
-
74
+
70
75
def last (self ):
71
76
""" return last element
72
77
>>> d = LinkedDeque()
@@ -76,27 +81,27 @@ def last(self):
76
81
'B'
77
82
"""
78
83
if self .is_empty ():
79
- raise Exception (' List is empty' )
84
+ raise Exception (" List is empty" )
80
85
return self ._trailer ._prev ._data
81
-
86
+
82
87
### DEque Insert Operations (At the front, At the end) ###
83
-
88
+
84
89
def add_first (self , element ):
85
90
""" insertion in the front
86
91
>>> LinkedDeque().add_first('AV').first()
87
92
'AV'
88
93
"""
89
94
return self ._insert (self ._header , element , self ._header ._next )
90
-
95
+
91
96
def add_last (self , element ):
92
97
""" insertion in the end
93
98
>>> LinkedDeque().add_last('B').last()
94
99
'B'
95
100
"""
96
101
return self ._insert (self ._trailer ._prev , element , self ._trailer )
97
-
102
+
98
103
### DEqueu Remove Operations (At the front, At the end) ###
99
-
104
+
100
105
def remove_first (self ):
101
106
""" removal from the front
102
107
>>> d = LinkedDeque()
@@ -114,9 +119,9 @@ def remove_first(self):
114
119
True
115
120
"""
116
121
if self .is_empty ():
117
- raise IndexError (' remove_first from empty list' )
122
+ raise IndexError (" remove_first from empty list" )
118
123
return self ._delete (self ._header ._next )
119
-
124
+
120
125
def remove_last (self ):
121
126
""" removal in the end
122
127
>>> d = LinkedDeque()
@@ -134,5 +139,5 @@ def remove_last(self):
134
139
True
135
140
"""
136
141
if self .is_empty ():
137
- raise IndexError (' remove_first from empty list' )
142
+ raise IndexError (" remove_first from empty list" )
138
143
return self ._delete (self ._trailer ._prev )
0 commit comments