# What is Linked List

Like arrays, Linked List is a linear data structure. Unlike arrays, linked list elements are not stored at a contiguous location; the elements are linked using pointers. They include a series of connected nodes. Here, each node stores the data and the address of the next node.

**Why Linked List?**

Arrays can be used to store linear data of similar types, but arrays have the following limitations:

The size of the arrays is fixed: So we must know the upper limit on the number of elements in advance. Also, generally, the allocated memory is equal to the upper limit irrespective of the usage.Insertion of a new element / Deletion of a existing element in an array of elements is expensive:The room has to be created for the new elements and to create room existing elements have to be shifted but in Linked list if we have the head node then we can traverse to any node through it and insert new node at the required position.

Example:

In a system, if we maintain a sorted list of IDs in an array id[] = [1000, 1010, 1050, 2000, 2040].

If we want to insert a new ID 1005, then to maintain the sorted order, we have to move all the elements after 1000 (excluding 1000).Deletion is also expensive with arrays until unless some special techniques are used. For example, to delete 1010 in id[], everything after 1010 has to be moved due to this so much work is being done which affects the efficiency of the code.

**Advantages of Linked Lists over arrays:**

- Dynamic Array.
- Ease of Insertion/Deletion.

**Drawbacks of Linked Lists:**

- Random access is not allowed. We have to access elements sequentially starting from the first node(head node). So we cannot do a binary search with linked lists efficiently with its default implementation.
- Extra memory space for a pointer is required with each element of the list.
- Not cache friendly. Since array elements are contiguous locations, there is locality of reference which is not there in case of linked lists.
- It takes a lot of time in traversing and changing the pointers.
- Reverse traversing is not possible in singly linked lists.
- It will be confusing when we work with pointers.
- Direct access to an element is not possible in a linked list as in an array by index.
- Searching an element is costly and requires O(n) time complexity.
- Sorting of linked list is very complex and costly.

## Types of Linked Lists:

**Simple Linked List**– In this type of linked list, one can move or traverse the linked list in only one direction. It is also called*“Singly Linked List”*.**Doubly Linked List**– In this type of linked list, one can move or traverse the linked list in both directions (Forward and Backward)**Circular Linked List**– In this type of linked list, the last node of the linked list contains the link of the first/head node of the linked list in its next pointer and the first/head node contains the link of the last node of the linked list in its prev pointer**Doubly Circular Linked List**– A Doubly Circular linked list or a circular two-way linked list is a more complex type of linked list that contains a pointer to the next as well as the previous node in the sequence. The difference between the doubly linked and circular doubly list is the same as that between a singly linked list and a circular linked list. The circular doubly linked list does not contain null in the previous field of the first node.**Header Linked List**– A header linked list is a special type of linked list that contains a header node at the beginning of the list.

## Basic operations on Linked Lists:

**Representation of Singly Linked Lists:**

A linked list is represented by a pointer to the first node of the linked list. The first node is called the head of the linked list. If the linked list is empty, then the value of the head points to NULL.

Each node in a list consists of at least two parts:

- A Data Item (we can store integer, strings, or any type of data).
- Pointer (Or Reference) to the next node (connects one node to another) or An address of another node

In C, we can represent a node using structures. Below is an example of a linked list node with integer data.

In Java or C#, LinkedList can be represented as a class and a Node as a separate class. The LinkedList class contains a reference of Node class type.

## C

`// A linked list node` `struct` `Node {` ` ` `int` `data;` ` ` `struct` `Node* next;` `};` |

## C++

`class` `Node {` `public` `:` ` ` `int` `data;` ` ` `Node* next;` `};` |

## Java

`class` `LinkedList {` ` ` `Node head; ` `// head of the list` ` ` `/* Linked list Node*/` ` ` `class` `Node {` ` ` `int` `data;` ` ` `Node next;` ` ` `// Constructor to create a new node` ` ` `// Next is by default initialized` ` ` `// as null` ` ` `Node(` `int` `d)` ` ` `{` ` ` `data = d;` ` ` `next = ` `null` `;` ` ` `}` ` ` `}` `}` |

## Python

`# Node class` `class` `Node:` ` ` `# Function to initialize the node object` ` ` `def` `__init__(` `self` `, data):` ` ` `self` `.data ` `=` `data ` `# Assign data` ` ` `self` `.` `next` `=` `None` `# Initialize` ` ` `# next as null` `# Linked List class` `class` `LinkedList:` ` ` `# Function to initialize the Linked` ` ` `# List object` ` ` `def` `__init__(` `self` `):` ` ` `self` `.head ` `=` `None` |

## C#

`class` `LinkedList {` ` ` `// The first node(head) of the linked list` ` ` `// Will be an object of type Node (null by default)` ` ` `Node head;` ` ` `class` `Node {` ` ` `int` `data;` ` ` `Node next;` ` ` `// Constructor to create a new node` ` ` `Node(` `int` `d) { data = d; }` ` ` `}` `}` |

## Javascript

`<script>` `var` `head; ` `// head of the list` `/* Linked list Node*/` ` ` `class Node ` ` ` `{` ` ` ` ` `// Constructor to create a new node` ` ` `// Next is by default initialized` ` ` `// as null` ` ` `constructor(val) {` ` ` `this` `.data = val;` ` ` `this` `.next = ` `null` `;` ` ` `}` ` ` `}` `// This code is contributed by gauravrajput1` `</script>` |

#### Construction of a simple linked list with 3 nodes:

**Traversal of a Linked List**

In the previous program, we created a simple linked list with three nodes. Let us traverse the created list and print the data of each node. For traversal, let us write a general-purpose function printList() that prints any given list.

## We strongly recommend that you click here and practice it, before moving on to the solution.

## C

`// A simple C program for` `// traversal of a linked list` `#include <stdio.h>` `#include <stdlib.h>` `struct` `Node {` ` ` `int` `data;` ` ` `struct` `Node* next;` `};` `// This function prints contents of linked list starting` `// from the given node` `void` `printList(` `struct` `Node* n)` `{` ` ` `while` `(n != NULL) {` ` ` `printf` `(` `" %d "` `, n->data);` ` ` `n = n->next;` ` ` `}` `}` `// Driver's code` `int` `main()` `{` ` ` `struct` `Node* head = NULL;` ` ` `struct` `Node* second = NULL;` ` ` `struct` `Node* third = NULL;` ` ` `// allocate 3 nodes in the heap` ` ` `head = (` `struct` `Node*)` `malloc` `(` `sizeof` `(` `struct` `Node));` ` ` `second = (` `struct` `Node*)` `malloc` `(` `sizeof` `(` `struct` `Node));` ` ` `third = (` `struct` `Node*)` `malloc` `(` `sizeof` `(` `struct` `Node));` ` ` `head->data = 1; ` `// assign data in first node` ` ` `head->next = second; ` `// Link first node with second` ` ` `second->data = 2; ` `// assign data to second node` ` ` `second->next = third;` ` ` `third->data = 3; ` `// assign data to third node` ` ` `third->next = NULL;` ` ` `// Function call` ` ` `printList(head);` ` ` `return` `0;` `}` |

## C++

`// A simple C++ program for` `// traversal of a linked list` `#include <bits/stdc++.h>` `using` `namespace` `std;` `class` `Node {` `public` `:` ` ` `int` `data;` ` ` `Node* next;` `};` `// This function prints contents of linked list` `// starting from the given node` `void` `printList(Node* n)` `{` ` ` `while` `(n != NULL) {` ` ` `cout << n->data << ` `" "` `;` ` ` `n = n->next;` ` ` `}` `}` `// Driver's code` `int` `main()` `{` ` ` `Node* head = NULL;` ` ` `Node* second = NULL;` ` ` `Node* third = NULL;` ` ` `// allocate 3 nodes in the heap` ` ` `head = ` `new` `Node();` ` ` `second = ` `new` `Node();` ` ` `third = ` `new` `Node();` ` ` `head->data = 1; ` `// assign data in first node` ` ` `head->next = second; ` `// Link first node with second` ` ` `second->data = 2; ` `// assign data to second node` ` ` `second->next = third;` ` ` `third->data = 3; ` `// assign data to third node` ` ` `third->next = NULL;` ` ` `// Function call` ` ` `printList(head);` ` ` `return` `0;` `}` `// This is code is contributed by rathbhupendra` |

## Java

`// A simple Java program for traversal of a linked list` `class` `LinkedList {` ` ` `Node head; ` `// head of list` ` ` `/* Linked list Node. This inner class is made static so` ` ` `that main() can access it */` ` ` `static` `class` `Node {` ` ` `int` `data;` ` ` `Node next;` ` ` `Node(` `int` `d)` ` ` `{` ` ` `this` `.data = d;` ` ` `next = ` `null` `;` ` ` `} ` `// Constructor` ` ` `}` ` ` `/* This function prints contents of linked list starting` ` ` `* from head */` ` ` `public` `void` `printList()` ` ` `{` ` ` `Node n = head;` ` ` `while` `(n != ` `null` `) {` ` ` `System.out.print(n.data + ` `" "` `);` ` ` `n = n.next;` ` ` `}` ` ` `}` ` ` `// Driver's code` ` ` `public` `static` `void` `main(String[] args)` ` ` `{` ` ` `/* Start with the empty list. */` ` ` `LinkedList llist = ` `new` `LinkedList();` ` ` `llist.head = ` `new` `Node(` `1` `);` ` ` `Node second = ` `new` `Node(` `2` `);` ` ` `Node third = ` `new` `Node(` `3` `);` ` ` `llist.head.next = second; ` `// Link first node with` ` ` `// the second node` ` ` `second.next` ` ` `= third; ` `// Link second node with the third node` ` ` `// Function call` ` ` `llist.printList();` ` ` `}` `}` |

## Python3

`# Python program for traversal of a linked list` `# Node class` `class` `Node:` ` ` `# Function to initialise the node object` ` ` `def` `__init__(` `self` `, data):` ` ` `self` `.data ` `=` `data ` `# Assign data` ` ` `self` `.` `next` `=` `None` `# Initialize next as null` `# Linked List class contains a Node object` `class` `LinkedList:` ` ` `# Function to initialize head` ` ` `def` `__init__(` `self` `):` ` ` `self` `.head ` `=` `None` ` ` `# This function prints contents of linked list` ` ` `# starting from head` ` ` `def` `printList(` `self` `):` ` ` `temp ` `=` `self` `.head` ` ` `while` `(temp):` ` ` `print` `(temp.data)` ` ` `temp ` `=` `temp.` `next` `# Code execution starts here` `if` `__name__ ` `=` `=` `'__main__'` `:` ` ` `# Start with the empty list` ` ` `llist ` `=` `LinkedList()` ` ` `llist.head ` `=` `Node(` `1` `)` ` ` `second ` `=` `Node(` `2` `)` ` ` `third ` `=` `Node(` `3` `)` ` ` `llist.head.` `next` `=` `second ` `# Link first node with second` ` ` `second.` `next` `=` `third ` `# Link second node with the third node` ` ` `llist.printList()` |

## C#

`// C# program for traversal of a linked list` `using` `System;` `public` `class` `LinkedList {` ` ` `Node head; ` `// head of list` ` ` `/* Linked list Node. This inner` ` ` `class is made static so that` ` ` `main() can access it */` ` ` `public` `class` `Node {` ` ` `public` `int` `data;` ` ` `public` `Node next;` ` ` `public` `Node(` `int` `d)` ` ` `{` ` ` `data = d;` ` ` `next = ` `null` `;` ` ` `} ` `// Constructor` ` ` `}` ` ` `/* This function prints contents of` ` ` `linked list starting from head */` ` ` `public` `void` `printList()` ` ` `{` ` ` `Node n = head;` ` ` `while` `(n != ` `null` `) {` ` ` `Console.Write(n.data + ` `" "` `);` ` ` `n = n.next;` ` ` `}` ` ` `}` ` ` `// Driver's code` ` ` `public` `static` `void` `Main(String[] args)` ` ` `{` ` ` `/* Start with the empty list. */` ` ` `LinkedList llist = ` `new` `LinkedList();` ` ` `llist.head = ` `new` `Node(1);` ` ` `Node second = ` `new` `Node(2);` ` ` `Node third = ` `new` `Node(3);` ` ` `llist.head.next = second; ` `// Link first node with` ` ` `// the second node` ` ` `second.next` ` ` `= third; ` `// Link second node with the third node` ` ` `// Function call` ` ` `llist.printList();` ` ` `}` `}` `/* This code contributed by PrinciRaj1992 */` |

## Javascript

`// A simple javascript program for traversal of a linked list` ` ` `var` `head; ` `// head of list` ` ` `/* Linked list Node. This inner class is made so that` ` ` `main() can access it */` ` ` `class Node {` ` ` `constructor(val) {` ` ` `this` `.data = val;` ` ` `this` `.next = ` `null` `;` ` ` `}` ` ` `}` ` ` `/* This function prints contents of linked list starting from head */` ` ` `function` `printList()` ` ` `{` ` ` `var` `n = head;` ` ` `while` `(n != ` `null` `) {` ` ` `document.write(n.data + ` `" "` `);` ` ` `n = n.next;` ` ` `}` ` ` `}` ` ` `/* method to create a simple linked list with 3 nodes*/` ` ` ` ` ` ` `/* Start with the empty list. */` ` ` ` ` `var` `head = ` `new` `Node(1);` ` ` `var` `second = ` `new` `Node(2);` ` ` `var` `third = ` `new` `Node(3);` ` ` `head.next = second; ` `// Link first node with the second node` ` ` `second.next = third; ` `// Link second node with the third node` ` ` `printList();` `// This code contributed by gauravrajput1` |

**Output**

1 2 3

**Time Complexity:**

Time Complexity |
Worst Case |
Average Case |

Search |
O(n) | O(n) |

Insertion |
O(1) | O(1) |

Deletion |
O(1) | O(1) |

*Search*is O(n) because as data is not stored in contiguous memory location so we have to traverse one by one.*Insertion*and*Deletion*is O(1) because we have to just link new node for Insertion with previous and next node and dislink exist node for deletion from previous and next node without any traversal.

**Auxiliary Space: **O(N) [To store dynamic memory]

## Please

Loginto comment...