|
5 | 5 | "metadata": {},
|
6 | 6 | "source": [
|
7 | 7 | "## Singly Linked Lists\n",
|
8 | | - "It is a collection of nodes. Each node has an element and a reference to the next node in the collections. **HEAD** is a member that points to the first node in the collection. The last node is called **TAIL**. The last node is has a reference to *None*. Traversing a linked list is also called **link hopping** or **pointer hopping**.\n", |
| 8 | + "It is a collection of nodes. Each node has an element and a reference to the next node in the collections. **HEAD** is a member that points to the first node in the collection. The last node is called **TAIL**. The last node has a reference to *None*. Traversing a linked list is also called **link hopping** or **pointer hopping**.\n", |
| 9 | + "\n", |
| 10 | + "Linked List have constant time insertion and deletion at any position, while arrays require O(n). Accessing an element takes O(k) to access kth position element. This is because one has to traverse from head to the kth position. Arrays, on the rather hand, require constant time to perform the operation. An important property of a linked list is it does not have a predefined fixed size. Hence can be expanded at run-time. \n", |
9 | 11 | "\n",
|
10 | | - "An important property of a linked list is it does not have a predefined fixed size.\n", |
11 | 12 | "To insert an element to the HEAD:\n",
|
12 | 13 | "* create a new node with the element\n",
|
13 | 14 | "* new node point to head reference\n",
|
14 | | - "* head point to ne node\n", |
| 15 | + "* head point to new node\n", |
15 | 16 | "\n",
|
16 | 17 | "To insert an element to the TAIL:\n",
|
17 | 18 | "* create a new node\n",
|
|
23 | 24 | "\n",
|
24 | 25 | "Removing an element from TAIL: not an easy task\n",
|
25 | 26 | "\n",
|
26 | | - "O(n) -> accessing element\n", |
| 27 | + "O(n) -> accessing element\n", |
27 | 28 | "O(1) -> insertion and deletion of an element "
|
28 | 29 | ]
|
29 | 30 | },
|
|
37 | 38 | "output_type": "stream",
|
38 | 39 | "text": [
|
39 | 40 | "1\n",
|
40 | | - "<__main__.Node object at 0x10c6005c0>\n", |
| 41 | + "<__main__.Node object at 0x103ece550>\n", |
41 | 42 | "2\n"
|
42 | 43 | ]
|
43 | 44 | }
|
|
72 | 73 | },
|
73 | 74 | {
|
74 | 75 | "cell_type": "code",
|
75 | | - "execution_count": 5, |
| 76 | + "execution_count": 6, |
76 | 77 | "metadata": {},
|
77 | 78 | "outputs": [
|
78 | 79 | {
|
79 | 80 | "name": "stdout",
|
80 | 81 | "output_type": "stream",
|
81 | 82 | "text": [
|
82 | | - "1\n" |
| 83 | + "1\n", |
| 84 | + "3\n" |
83 | 85 | ]
|
84 | 86 | }
|
85 | 87 | ],
|
|
88 | 90 | " def __init__(self, ele):\n",
|
89 | 91 | " self.prev_node = None\n",
|
90 | 92 | " self.value = ele\n",
|
91 | | - " self.next_node = Node\n", |
| 93 | + " self.next_node = None\n", |
92 | 94 | " \n",
|
93 | 95 | "a = DoublyLLNode(1)\n",
|
94 | 96 | "b = DoublyLLNode(2)\n",
|
|
99 | 101 | "b.next_node = c\n",
|
100 | 102 | "c.prev_node = b\n",
|
101 | 103 | "\n",
|
102 | | - "print(b.prev_node.value)" |
| 104 | + "print(b.prev_node.value) # a\n", |
| 105 | + "print(b.next_node.value) # c" |
103 | 106 | ]
|
104 | 107 | },
|
105 | 108 | {
|
|
111 | 114 | },
|
112 | 115 | {
|
113 | 116 | "cell_type": "code",
|
114 | | - "execution_count": 2, |
| 117 | + "execution_count": 5, |
115 | 118 | "metadata": {},
|
116 | 119 | "outputs": [
|
117 | 120 | {
|
|
125 | 128 | ],
|
126 | 129 | "source": [
|
127 | 130 | "\"\"\"\n",
|
128 | | - "Singly Linked List Cycle List: check if the list has cycles\n", |
129 | | - "\"\"\"\n", |
130 | | - "class Node(object):\n", |
131 | | - " def __init__(self, ele):\n", |
132 | | - " self.value = ele\n", |
133 | | - " self.nextnode = None\n", |
134 | | - " \n", |
| 131 | + "Singly Linked List Cycle Check: check if the list has cycles\n", |
| 132 | + "\"\"\" \n", |
135 | 133 | "def cycle_check(node):\n",
|
136 | 134 | " marker1 = node\n",
|
137 | 135 | " marker2 = node\n",
|
138 | | - " while marker2!=None and marker2.nextnode!=None:\n", |
139 | | - " marker1 = marker1.nextnode\n", |
140 | | - " marker2 = marker2.nextnode.nextnode\n", |
| 136 | + " while marker2!=None and marker2.next_node!=None:\n", |
| 137 | + " marker1 = marker1.next_node\n", |
| 138 | + " marker2 = marker2.next_node.next_node\n", |
141 | 139 | " if marker2 == marker1:\n",
|
142 | 140 | " return True\n",
|
143 | 141 | " return False\n",
|
|
146 | 144 | "b = Node(2)\n",
|
147 | 145 | "c = Node(3)\n",
|
148 | 146 | "\n",
|
149 | | - "a.nextnode = b\n", |
150 | | - "b.nextnode = c\n", |
| 147 | + "a.next_node = b\n", |
| 148 | + "b.next_node = c\n", |
151 | 149 | "print(cycle_check(a))\n",
|
152 | | - "c.nextnode = a\n", |
| 150 | + "c.next_node = a\n", |
153 | 151 | "print(cycle_check(a))"
|
154 | 152 | ]
|
155 | 153 | },
|
156 | 154 | {
|
157 | 155 | "cell_type": "code",
|
158 | | - "execution_count": 11, |
| 156 | + "execution_count": 10, |
159 | 157 | "metadata": {},
|
160 | 158 | "outputs": [
|
161 | 159 | {
|
|
175 | 173 | "\n",
|
176 | 174 | "def reverse_list(node):\n",
|
177 | 175 | " previous = None\n",
|
178 | | - " nextnode = None\n", |
| 176 | + " next_node = None\n", |
179 | 177 | " current = node\n",
|
180 | 178 | " while current:\n",
|
181 | | - " nextnode = current.nextnode\n", |
182 | | - " current.nextnode = previous\n", |
| 179 | + " next_node = current.next_node\n", |
| 180 | + " current.next_node = previous\n", |
183 | 181 | " previous = current\n",
|
184 | | - " current = nextnode\n", |
| 182 | + " current = next_node\n", |
185 | 183 | "\n",
|
186 | 184 | "a = Node(1)\n",
|
187 | 185 | "b = Node(2)\n",
|
188 | 186 | "c = Node(3)\n",
|
189 | 187 | "d = Node(4)\n",
|
190 | 188 | "\n",
|
191 | | - "a.nextnode = b\n", |
192 | | - "b.nextnode = c\n", |
193 | | - "c.nextnode = d\n", |
| 189 | + "a.next_node = b\n", |
| 190 | + "b.next_node = c\n", |
| 191 | + "c.next_node = d\n", |
194 | 192 | "\n",
|
195 | 193 | "reverse_list(a)\n",
|
196 | 194 | "# now, d is the head node. \n",
|
197 | | - "print(d.nextnode.value)\n", |
198 | | - "print(c.nextnode.value)\n", |
199 | | - "print(b.nextnode.value)" |
| 195 | + "print(d.next_node.value)\n", |
| 196 | + "print(c.next_node.value)\n", |
| 197 | + "print(b.next_node.value)" |
200 | 198 | ]
|
201 | 199 | },
|
202 | 200 | {
|
203 | 201 | "cell_type": "code",
|
204 | | - "execution_count": 16, |
| 202 | + "execution_count": 11, |
205 | 203 | "metadata": {},
|
206 | 204 | "outputs": [
|
207 | 205 | {
|
|
210 | 208 | "3"
|
211 | 209 | ]
|
212 | 210 | },
|
213 | | - "execution_count": 16, |
| 211 | + "execution_count": 11, |
214 | 212 | "metadata": {},
|
215 | 213 | "output_type": "execute_result"
|
216 | 214 | }
|
|
225 | 223 | " left_pointer = head\n",
|
226 | 224 | " right_pointer = head\n",
|
227 | 225 | " for i in range(n-1):\n",
|
228 | | - " if not right_pointer.nextnode:\n", |
| 226 | + " if not right_pointer.next_node:\n", |
229 | 227 | " raise LookupError(\"List is short\")\n",
|
230 | | - " right_pointer = right_pointer.nextnode\n", |
231 | | - " while right_pointer.nextnode:\n", |
232 | | - " right_pointer = right_pointer.nextnode\n", |
233 | | - " left_pointer = left_pointer.nextnode\n", |
| 228 | + " right_pointer = right_pointer.next_node\n", |
| 229 | + " while right_pointer.next_node:\n", |
| 230 | + " right_pointer = right_pointer.next_node\n", |
| 231 | + " left_pointer = left_pointer.next_node\n", |
234 | 232 | " return left_pointer.value\n",
|
235 | 233 | " \n",
|
236 | 234 | " \n",
|
|
239 | 237 | "c = Node(3)\n",
|
240 | 238 | "d = Node(4)\n",
|
241 | 239 | "\n",
|
242 | | - "a.nextnode = b\n", |
243 | | - "b.nextnode = c\n", |
244 | | - "c.nextnode = d\n", |
| 240 | + "a.next_node = b\n", |
| 241 | + "b.next_node = c\n", |
| 242 | + "c.next_node = d\n", |
245 | 243 | "\n",
|
246 | 244 | "nth_last(2, a)"
|
247 | 245 | ]
|
|
263 | 261 | "name": "python",
|
264 | 262 | "nbconvert_exporter": "python",
|
265 | 263 | "pygments_lexer": "ipython3",
|
266 | | - "version": "3.7.3" |
| 264 | + "version": "3.7.4" |
267 | 265 | }
|
268 | 266 | },
|
269 | 267 | "nbformat": 4,
|
|
0 commit comments