A linked list is a common data structure made of one or more than one nodes. Each node contains a value and a pointer to the previous/next node forming the chain-like structure. These nodes are stored randomly in the system's memory, which improves its space complexity compared to the array.
Singly-linked list
Doubly linked list
Circular linked list
In this Answer, we'll learn about the singly linked list and its operations.
Hint: Have you ever played Treasure Hunt? It works same as linked list.
We create a linked list by using classes. Here we implement a singly linked list. Let's see how to code a linked list.
class node {public:int data;node* link;};
We make a node
class that has the data
attributes and a node pointer link that stores the address of the node.
node* head, *tail =new node();head = NULL, tail=NULL;
The head
pointer points to the first node, and the last element of the list point to the null, which is the tail
. When the list is empty, the head
and tail
the pointer points to NULL
.
We perform the following functions on the linked list:
Insertion
Search
Deletion
We can insert a node at the start as head, at the end as tail, or any desired position by entering the position number. Here, we insert the first element at the beginning to create the head and then the upcoming elements at the tail.
#include<iostream>using namespace std;class node { //Creating a class of nodepublic:node* link=NULL;int data=0;};class singly_link_list { //This class stores the nodes of the listpublic:node* head = NULL,*tail=NULL;void add_node(int p_data) { //function for adding new nodes into listnode* temp_node=new node(); //temp_node stores the data temporarytemp_node->data = p_data;temp_node->link = NULL;if (head == NULL) { //Creating headhead = temp_node;tail = temp_node;}else { //For insertion of all nodes other than headtail->link = temp_node;tail = tail->link;}}void display() { //Function to print linked listnode* temp_node = head;cout << "Link List : ";while (temp_node != NULL) //Traversing each element and printing them{cout << temp_node->data << " ";temp_node = temp_node->link;}}};//Driver codeint main(){singly_link_list list;list.add_node(2); //Inserting headlist.add_node(4); //Inserting other nodeslist.add_node(6);list.display(); //printing list}
In this code, the add_node
function is used to insert nodes into the linked list. First, it checks whether the list exists or not. If yes, a new node is added to the list, and a head is created.
We can search in the linked list by traversing all the elements starting from the head node.
void singly_link_list::search(int p_data) { //Function for searchingnode* temp = head; //temporary nodeint counter=0;while (temp != NULL) { //traversing listcounter++;if (temp->data == p_data) { //Value foundcout << "\nValue has been found at position: " << counter<<endl;return;}else { //Traverse next elementtemp = temp->link;}}cout << "\nValue doesn't exist in link list" << endl;}//Driver codeint main(){singly_link_list list;list.add_node(2);list.add_node(4);list.add_node(6);list.display();list.search(4);}
In this code, the search
function is defined to search the given value p_data
. We use while
loop to traverse the linked list. After finding the value, the loop breaks down. If the loop is not broken, the entered value doesn't exist in the linked list.
We can delete the head node, the tail, or at any desired position by first searching it. Here we delete the second node.
#include<iostream>using namespace std;void singly_link_list::delete_node(int p_data){ //function for deletionnode* current = new node(),*prev=new node(); //temporary nodes for keeping the trackcurrent = head;prev = tail;//Deleting Headif (p_data == head->data){head = head->link;delete current;return;}while (current!=NULL){if (current->data == p_data)break;prev = current;current = current->link;}//Deleting Tailif (p_data == tail->data){tail = prev;prev->link = NULL;delete current;return;}else if (current==NULL) //Element is not found{cout << endl << p_data << " doesn't exist in link list" << endl;}else //Traversing next node{prev->link = current->link;delete current;}}//Driver codeint main(){singly_link_list list;list.add_node(2);list.add_node(4);list.add_node(6);cout<<"Before Delete, ";list.display();list.delete_node(4);cout<<"\nAfter Delete, ";list.display();}
In this code, delete_node
is defined to delete the head, tail, or any node of a linked list. current
and prev
nodes are keeping track of the linked list.
Line 12–26: We delete the head note, and assign the next node as head.
Line 30–36: We delete the tail node, and assign the last node as tail.
Line 38–48: We set the current
to the next node. If current
it becomes empty, the given data p_data
doesn't exist in the linked list.
Case | Worst | Average |
Insertion | O(n) | O(1) |
Search | O(n) | O(n) |
Deletion | O(n) | O(1) |