Linked Lists
Tarun Luthra




Agenda

What you will learn?
-
Classes & Objects Revision
-
What are Linked Lists ?
-
Basic Functionality


Classes & Objects Revision
class Node {
int x = 0;
int y = 0;
}
class Node:
x = 0
y = 0


Classes & Objects Revision
class Node {
int x = 0;
int y = 0;
}
class Main {
public static void main(String[] args) {
Node n1 = new Node();
}
}
class Node:
x = 0
y = 0
def main():
n1 = Node()
main()


Classes & Objects Revision
class Node {
int x = 0;
int y = 0;
}
class Main {
public static void main(String[] args) {
Node n1 = new Node();
System.out.println(n1.x); // 0
System.out.println(n1.y); // 0
}
}
class Node:
x = 0
y = 0
def main():
n1 = Node()
print(n1.x) # 0
print(n1.x) # 0
main()


Classes & Objects Revision
class Node {
int x = 0;
int y = 0;
}
class Main {
public static void main(String[] args) {
Node n1 = new Node();
n1.x = 50;
n1.y = 20;
System.out.println(n1.x); // 50
System.out.println(n1.y); // 20
}
}
class Node:
x = 0
y = 0
def main():
n1 = Node()
n1.x = 50
n1.y = 20
print(n1.x) # 50
print(n1.y) # 20
main()


Classes & Objects Revision
class Node {
int x = 0;
int y = 0;
}
class Main {
public static void main(String[] args) {
Node n1 = new Node();
n1.x = 50;
n1.y = 20;
Node n2 = n1;
System.out.println(n1.x);
System.out.println(n1.y);
}
}
class Node:
x = 0
y = 0
def main():
n1 = Node()
n1.x = 50
n1.y = 20
n2 = n1
print(n1.x)
print(n1.y)
main()


Classes & Objects Revision
class Node {
int x = 0;
int y = 0;
}
class Main {
public static void main(String[] args) {
Node n1 = new Node();
n1.x = 50;
n1.y = 20;
Node n2 = n1;
n2.x = 100;
System.out.println(n1.x);
System.out.println(n1.y);
}
}
class Node:
x = 0
y = 0
def main():
n1 = Node()
n1.x = 50
n1.y = 20
n2 = n1
n2.x = 100
print(n1.x)
print(n1.y)
main()


class Node {
int x = 0;
int y = 0;
}
class Main {
public static void main(String[] args) {
Node n1 = new Node();
n1.x = 50;
n1.y = 20;
Node n2 = n1;
n2.x = 100;
Node n3 = n1;
System.out.println(n3.x); // 100
System.out.println(n3.y); // 20
}
}
class Node:
x = 0
y = 0
def main():
n1 = Node()
n1.x = 50
n1.y = 20
n2 = n1
n2.x = 100
n3 = n1
print(n3.x) # 100
print(n3.y) # 20
main()


class Node {
int x = 0;
int y = 0;
}
class Main {
public static void main(String[] args) {
Node n1 = new Node();
n1.x = 50;
n1.y = 20;
Node n2 = n1;
n2.x = 100;
Node n3 = n1;
System.out.println(n3.x); // 100
System.out.println(n3.y); // 20
Node n4 = new Node();
}
}
class Node:
x = 0
y = 0
def main():
n1 = Node()
n1.x = 50
n1.y = 20
n2 = n1
n2.x = 100
n3 = n1
print(n3.x) # 100
print(n3.y) # 20
n4 = Node()
main()


Constructors
class Node {
int x = 0;
int y = 0;
}
class Main {
public static void main(String[] args) {
Node n1 = new Node();
n1.x = 50;
n1.y = 20;
Node n2 = new Node();
n2.x = -20;
n2.y = 10;
}
}
class Node:
x = 0
y = 0
def main():
n1 = Node()
n1.x = 50
n1.y = 20
n2 = Node()
n2.x = -20
n2.y = 10
main()


Constructors
class Node {
int x = 0;
int y = 0;
Node(int a, int b) {
x = a;
y = b;
}
}
class Main {
public static void main(String[] args) {
Node n1 = new Node(50, 20);
Node n2 = new Node(-20, 10);
}
}
class Node:
x = 0
y = 0
def __init__(self, a, b):
self.x = a
self.y = b
def main():
n1 = Node(50, 20)
n2 = Node(-20, 10)
main()


Can we have an object reference as a property ? 🧐


The 'next' property
class Node {
int data = 0;
Node next = null;
}
class Node:
data = 0
next = None


The 'next' property
class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None


The 'next' property
class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
main()


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
main()
data
next


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
main()
data
next
10
null


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
main()
data
next
10
null
t1


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
t1.next = new Node(20);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
t1.next = Node(20)
main()
data
next
10
null
t1


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
t1.next = new Node(20);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
t1.next = Node(20)
main()
data
next
10
null
t1
data
next
20
null


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
t1.next = new Node(20);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
t1.next = Node(20)
main()
data
next
10
t1
data
next
20
null


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
t1.next = new Node(20);
Node t2 = t1.next;
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
t1.next = Node(20)
t2 = t1.next
main()
data
next
10
t1
data
next
20
null


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
t1.next = new Node(20);
Node t2 = t1.next;
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
t1.next = Node(20)
t2 = t1.next
main()
data
next
10
t1
data
next
20
null
t2


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
t1.next = new Node(20);
Node t2 = t1;
t2.next = new Node(30);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
t1.next = Node(20)
t2 = t1.next
t2.next = Node(30)
main()
data
next
10
t1
data
next
20
null
t2
data
next
30


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
t1.next = new Node(20);
Node t2 = t1;
t2.next = new Node(30);
t2 = t2.next;
System.out.println(t2.data);
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
t1.next = Node(20)
t2 = t1.next
t2.next = Node(30)
t2 = t2.next
print(t2.data)
main()
data
next
10
t1
data
next
20
null
t2
data
next
30


class Node {
int data = 0;
Node next = null;
Node(int x) {
data = x;
next = null;
}
}
class Main {
public static void main(String[] args) {
Node t1 = new Node(10);
t1.next = new Node(20);
Node t2 = t1;
t2.next = new Node(30);
t2 = t2.next;
System.out.println(t2.data); // 30
}
}
class Node:
data = 0
next = None
def __init__(self, x):
self.data = x
self.next = None
def main():
t1 = Node(10)
t1.next = Node(20)
t2 = t1.next
t2.next = Node(30)
t2 = t2.next
print(t2.data) # 30
main()
data
next
10
t1
data
next
20
null
t2
data
next
30


data
next
10
t1
data
next
20
null
t2
data
next
30



data
next
10
t1
data
next
20
null
t2
data
next
30

We only need head Node address to access entire chain of data.


data
next
10
t1
data
next
20
null
t2
data
next
30
This type of data structure is called a


data
next
10
t1
data
next
20
null
t2
data
next
30
This type of data structure is called a
Linked List


data
next
10
t1
data
next
20
null
data
next
30
Linked List
A Linked List is a linear data structure consisting of connected nodes where each node has corresponding data and a pointer to the address of the next node.
The first node of a linked list is called the Head, and it acts as an access point.

Time to try!
Let's begin!





Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
null


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 2


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 2
data
next
2


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 2
data
next
2


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 3
data
next
2


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 3
data
next
2
data
next
3


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 3
data
next
2
data
next
3


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 4
data
next
2
data
next
3


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 4
data
next
2
data
next
3
data
next
4


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
i = 4
data
next
2
data
next
3
data
next
4


Given N > 0, create a linked list which contains data from 1 to N.
Node generateLL(int n) {
Node head = new Node(1);
Node temp = head;
for (int i = 2; i <= n; i++) {
temp.next = new Node(i);
temp = temp.next;
}
return head;
}
def generateLL(n):
head = Node(1)
temp = head
for i in range(2, n + 1):
temp.next = Node(i)
temp = temp.next
return head
n = 4
data
next
1
head
temp
null
return head
data
next
2
data
next
3
data
next
4


Size of a Linked List 👨💻


Given the head of a linked list, return its size


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
null
data
next
2
data
next
3
data
next
4


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
count = 0


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
count = 1


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
count = 1


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
count = 2


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
count = 2


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
count = 3


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
count = 4


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
count = 4


Given the head of a linked list, return its size
int size(Node head) {
Node temp = head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
def size(head):
temp = head
count = 0
while temp != None:
count += 1
temp = temp.next
return count
data
next
1
head
temp
null
data
next
2
data
next
3
data
next
4
return count
count = 4


Insertion


Given the head node of a linked list, insert a new node at kth index (0 based indexing)


Given the head node of a linked list, insert a new node at kth index (0 based indexing)
Node insert(Node head, int pos, int data) {
if (pos < 0 || pos > size(head)) {
return head;
}
Node temp = head;
Node newNode = new Node(data);
if (pos == 0) {
newNode.next = head;
return newNode;
}
for (int i = 0; i < pos - 1; i++) {
temp = temp.next;
}
newNode.next = temp.next;
temp.next = newNode;
return head;
}
def insert(head, pos, data):
if pos < 0 or pos > size(head):
return head
temp = head
newNode = Node(data)
if pos == 0:
newNode.next = head
return newNode
for i in range(pos - 1):
temp = temp.next
newNode.next = temp.next
temp.next = newNode
return head


Codes 👨💻
Java -
https://ide.codingminutes.com/?id=aii
Python -
https://ide.codingminutes.com/?id=aik


Thank you! 👨💻
Linked Lists Basics
By Tarun Luthra
Linked Lists Basics
- 319