Singly LinekdLists
Houssem
June 1, 2021
Singly Linked Lists
A linked list is A data structure that contains a head, tail and length property. In general, Linked Lists consist of nodes, and each node has a value and a pointer to another node or just points to null. Unlike arrays, Linked Lists do not support random data access and they do not have indecies. Instead, they are connected via nodes with a next pointer.
0- Initialize a new Singly Linked List
JavaScript
class Node{
constructor(val){
this.val = val;
this.next = null;
}
}
class SinglyLinkedList{
constructor(){
this.head = null;
this.tail = null;
this.length = 0;
}
}
Python
class Node:
def __init__(self, val):
self.val = val
self.next = None
class SinglyLinkedList:
def __init__(self):
self.length = 0
self.head = None
self.tail = None
1- Adding (pushing) a new node to the end of the Linked List
JavaScript
push(val){
let newNode = new Node(val);
if(! this.head){
this.head = newNode;
this.tail = this.head;
} else{
this.tail.next = newNode;
this.tail = newNode;
}
this.length++;
return this;
}
Python
def push(self, val):
new_node = Node(val)
if not self.head:
self.head = new_node
self.tail = self.head
else:
self.tail.next = new_node
self.tail = new_node
self.length += 1
return self
2- Adding (unshifting) a node to the beginning of the Linked List
JavaScript
unshift(val){
let newNode = new Node(val);
if(!this.head){
this.head = newNode;
this.tail = this.head;
} else{
let currentHead = this.head;
newNode.next = currentHead;
this.head = newNode;
}
this.length++;
return this;
}
Python
def unshift(self, val):
new_node = Node(val)
if not self.head:
self.head = new_node
else:
new_node.next = self.head
self.head = new_node
self.length += 1
return self
3- Inserting a node at a specific position
JavaScript
insert(index, val){
if(index < 0 || index > this.length) return false;
if(index === this.length) return !!this.push(val);
if(index === 0) return !!this.unshift(val);
let newNode = new Node(val);
let previous = this.get(index - 1);
let temp = previous.next;
previous.next = newNode;
newNode.next = temp;
this.length++;
return true;
}
Python
def insert(self, index, val):
if index < 0 or index > self.length:
return "undefined"
if index == self.length:
return not not self.push(val)
if index == 0:
return not not self.unshift(val)
new_node = Node(val)
previous = self.get(index - 1)
temp = previous.next
previous.next = new_node
new_node.next = temp
self.length += 1
return True
4- Removing (popping) a node from the end of the Linked List
JavaScript
pop(){
if(!this.head) return undefined;
let current = this.head;
let newTail = current;
while(current.next){
newTail = current;
current = current.next;
}
this.tail = newTail;
this.tail.next = null;
this.length--;
if(this.length === 0){
this.head = null;
this.tail = null;
}
return current;
}
Python
def pop(self):
if not self.head:
return "undefined"
current = self.head
new_tail = current
while current.next:
new_tail = current
current = current.next
self.tail = new_tail
self.tail.next = None
self.length -= 1
return current
5- Removing (shifting) a node from the beginning of the Linked List
JavaScript
shift(){
if(!this.head) return undefined;
let current = this.head;
this.head = current.next;
this.length--;
if(this.length === 0){
this.tail = null;
}
return current;
}
Python
def shift(self):
if not self.head:
return "undefined"
current_head = self.head
self.head = current_head.next
self.length -= 1
return current_head