In this article, we will be discussing Singly Linked List Program in C++ using class.
A Singly Linked List is unidirectional. Each node stores the reference to the next node. Since we are not storing the address of the previous node, we cannot traverse back, making it unidirectional.

The head pointer points to the first node of a Linked List.
We implement linked list using 2 classes:
- node class
- Linked List class
node class
class node{
public:
int v;
node *next;
node(){
next = NULL;
}
};
node class represents each node of the Linked List. It contains 2 public variables – v and next. v stores the data and next stores the address to the next node.
LinkedList class
class LinkedList{
node *head;
public:
/* Member functions to perform
different operations on Linked List */
void insert_at_beignning(int v);
void insert_at_end(int v);
void insert_at_given_position(int v, int p);
void delete_at_beignning();
void delete_at_end();
void delete_at_given_position(int p);
void print();
};
LinkedList class contains a pointer head that points to the first node of the linked list and public member functions which performs various operations on the Linked List.
Singly Linked List Opeartions
We are going to code and discuss the following operations on the linked list.
- Insert at Beginning.
- Inset at End.
- Insert in Mid.
- Delete at Beginning.
- Delete at End.
- Delete in Mid.
- Print Linked List
Insert at Beignning
void insert_at_beginning(int v){
node *temp = new node();
temp->v = v;
temp->next = head;
head = temp;
}
The function accepts 1 argument that is the data we want to insert.
- First, initialize a new node temp with value v.
- Set temp->next to the address of the first node of the linked list, that is head.
- Make temp the new head.
Insert at End
void insert_at_end(int v){
node *temp = new node();
temp->v = v;
if (head == NULL){
// if linked list is empty, that is head == NULL
// Make temp the new head
head = temp;
}
else{
// if linked list is not empty
// go to the last node of the linked list
node *ptr = head;
// the loop sets ptr to last node of the linked list
while (ptr->next != NULL){
ptr = ptr->next;
}
// ptr now points to the last node
// store temp address in the next of ptr
ptr->next = temp;
}
}
- Initialize a new node temp with value v.
- If the linked list is empty, simply make temp the new head.
- If the linked list is not empty, move to the last node of the linked list and set the next of the last node to temp.
Insert in Mid
void insert_at_given_position(int v, int p){
node *temp = new node();
temp->v = v;
if (p == 0){
// if p==0 then insert temp at beginning
temp->next = head;
head = temp;
}
else{
node *ptr = head;
// the loop sets ptr to (p-1)th node
while(p>1) {
ptr = ptr->next;
--p;
}
// ptr now points to (p-1)th node
// insert temp between (p-1)th and pth node
temp->next = ptr->next;
ptr->next = temp;
}
}
The function accepts 2 arguments. v is the data we need to insert and p is the position where we want to insert v.
- Initialize a new node temp with value v.
- If p == 0, then simply insert temp at beginning of the linked list.
- If p > 0, move to the (p-1)th node and then insert temp between (p-1)th and pth node.
Delete at Beginning
void delete_at_beginning(){
if (head == NULL){
cout<<"List is Empty"<<endl;
}
else{
cout<<"Element Deleted: "<<head->v<<endl;
// if linked list is not empty
// store address of first node in temp
node *temp = head;
// set second node as the new head of the linked list
head = head->next;
// free the old head
delete(temp);
}
}
- If the linked list is empty, do nothing.
- Otherwise, store the address of the first node of the linked list in temp. Then make the 2nd node of the linked list, that is head->next the new head. After that, free the old head ( that is temp ).
Delete at End
void delete_at_end(){
if (head == NULL){
cout<<"List is Empty"<<endl;
}
else if (head->next == NULL){
// if there's only 1 element in the linked list
// free head and set it to NULL
cout<<"Element Deleted: "<<head->v<<endl;
delete(head);
head = NULL;
}
else{
// if there's more than 1 element in the linked
// traverse to 2nd last element of the linked list
node *temp = head;
while (temp->next->next != NULL) {
temp = temp->next;
}
// temp now points to the 2nd last element of the linked list
cout<<"Element Deleted: "<<temp->next->v<<endl;
// delete last node
delete(temp->next);
// set the next of 2nd last element to NULL
temp->next = NULL;
}
}
- If the list is empty, do nothing.
- If the linked list contains only 1 node, simply free the head and set head to NULL.
- Otherwise, if the linked list contains more than 1 element, move to the 2nd last element of the linked list. Free the memory of the last node and set the next of 2nd last element to NULL.
Delete in Mid
void delete_at_given_position(int p){
if (head == NULL){
// if list is empty do nothing
cout<<"List is Empty"<<endl;
}
else{
node *temp, *ptr;
if (p == 0) {
// if p==0, perform delete at beginning
cout<<"Element Deleted: "<<head->v<<endl;
ptr = head;
head = head->next;
delete(ptr);
}
else{
// if p > 0
// set ptr to pth node and temp to (p-1)th node
temp = ptr = head;
while(p>0){
--p;
temp = ptr;
ptr = ptr->next;
}
cout<<"Element Deleted: "<<ptr->v<<endl;
// set next of (p-1)th node to next of pth node
temp->next = ptr->next;
// free pth node
free(ptr);
}
}
}
The function accepts 1 argument p, that is the position of node we want to delete.
- If the list is empty, do nothing.
- If p == 0, simply delete the first node.
- If p > 0,
- First set ptr to pth node and temp to (p-1)th node of the linked list.
- Set temp->next to ptr->next.
- Delete ptr.
Print Linked List
void print(){
if (head == NULL){
cout<<"List is empty"<<endl;
}
else{
node *temp = head;
cout<<"Linekd List: ";
while (temp != NULL){
cout<<temp->v<<"->";
temp = temp->next;
}
cout<<"NULL"<<endl;
}
}
Simply traverse though all the nodes from head and print the data.
Program of Singly Linked List in C++ using class
#include<iostream>
#include<vector>
using namespace std;
class node{
public:
int v;
node *next;
node(){
next = NULL;
}
};
class LinkedList{
node *head;
public:
LinkedList(){
head = NULL;
}
void insert_at_beginning(int v){
node *temp = new node();
temp->v = v;
temp->next = head;
head = temp;
}
void insert_at_end(int v){
node *temp = new node();
temp->v = v;
if (head == NULL){
// if linked list is empty
// make temp the new head
head = temp;
}
else{
// if linked list is not empty
// go to the last node of the linked list
node *ptr = head;
// the loop sets ptr to last node of the linked list
while (ptr->next != NULL){
ptr = ptr->next;
}
// ptr now points to the last node of the linked list
// store temp in the next of ptr
ptr->next = temp;
}
}
void insert_at_given_position(int v, int p){
node *temp = new node();
temp->v = v;
if (p == 0){
// if p==0 then insert temp at beginning
temp->next = head;
head = temp;
}
else{
node *ptr = head;
// the loop sets ptr to (p-1)th node
while(p>1) {
ptr = ptr->next;
--p;
}
// ptr now points to (p-1)th node
// insert temp between (p-1)th and pth node
temp->next = ptr->next;
ptr->next = temp;
}
}
void delete_at_beginning(){
if (head == NULL){
cout<<"List is Empty"<<endl;
}
else{
cout<<"Element Deleted: "<<head->v<<endl;
// if linked list is not empty
// store address of first node of the linked list in temp
node *temp = head;
// set second node as the new head of the linked list
head = head->next;
// free the old head
delete(temp);
}
}
void delete_at_end(){
if (head == NULL){
cout<<"List is Empty"<<endl;
}
else if (head->next == NULL){
// if there's only 1 node in the linked list
// free head and set it to NULL
cout<<"Element Deleted: "<<head->v<<endl;
delete(head);
head = NULL;
}
else{
// if there's more than 1 node in the linked
// traverse to 2nd last node of the linked list
node *temp = head;
// the loop sets temp to 2nd last node of the linked list
while (temp->next->next != NULL) {
temp = temp->next;
}
// temp now points to the 2nd last node of the linked list
cout<<"Element Deleted: "<<temp->next->v<<endl;
// delete last node
delete(temp->next);
// set the next of 2nd last node to NULL
temp->next = NULL;
}
}
void delete_at_given_position(int p){
if (head == NULL){
// if list is empty do nothing
cout<<"List is Empty"<<endl;
}
else{
node *temp, *ptr;
if (p == 0) {
// if p==0, perform delete at beginning
cout<<"Element Deleted: "<<head->v<<endl;
ptr = head;
head = head->next;
delete(ptr);
}
else{
// if p > 0
// set ptr to pth node and temp to (p-1)th node
temp = ptr = head;
while(p>0){
--p;
temp = ptr;
ptr = ptr->next;
}
cout<<"Element Deleted: "<<ptr->v<<endl;
// set next of (p-1)th node to next of pth node
temp->next = ptr->next;
// free pth node
free(ptr);
}
}
}
void print(){
if (head == NULL){
cout<<"List is empty"<<endl;
}
else{
node *temp = head;
cout<<"Linked List: ";
while (temp != NULL){
cout<<temp->v<<"->";
temp = temp->next;
}
cout<<"NULL"<<endl;
}
}
};
int main() {
printf("1 to Insert at the beginning");
printf("\n2 to Insert at the end");
printf("\n3 to Insert at mid");
printf("\n4 to Delete from beginning");
printf("\n5 to Delete from the end");
printf("\n6 to Delete from mid");
printf("\n7 to Display");
printf("\n0 to Exit");
int choice,v,p;
LinkedList ll;
do {
cout<<"\nEnter Your Choice: ";
cin>>choice;
switch (choice)
{
case 1:
cout<<"Enter Element: ";
cin>>v;
ll.insert_at_beginning(v);
break;
case 2:
cout<<"Enter Element: ";
cin>>v;
ll.insert_at_end(v);
break;
case 3:
cout<<"Enter Element: ";
cin>>v;
cout<<"Enter Position ( zero-indexed ): ";
cin>>p;
ll.insert_at_given_position(v,p);
break;
case 4:
ll.delete_at_beginning();
break;
case 5:
ll.delete_at_end();
break;
case 6:
cout<<"Enter Position ( zero-indexed ): ";
cin>>p;
ll.delete_at_given_position(p);
break;
case 7:
ll.print();
break;
}
} while (choice != 0);
}
1 to Insert at the beginning
2 to Insert at the end
3 to Insert at mid
4 to Delete from beginning
5 to Delete from the end
6 to Delete from mid
7 to Display
0 to Exit
Enter Your Choice: 1
Enter Element: 10
Enter Your Choice: 1
Enter Element: 9
Enter Your Choice: 2
Enter Element: 11
Enter Your Choice: 7
Linked List: 9->10->11->NULL
Enter Your Choice: 3
Enter Element: 20
Enter Position ( zero-indexed ): 2
Enter Your Choice: 7
Linked List: 9->10->20->11->NULL
Enter Your Choice: 3
Enter Element: 30
Enter Position ( zero-indexed ): 1
Enter Your Choice: 7
Linked List: 9->30->10->20->11->NULL
Enter Your Choice: 2
Enter Element: 40
Enter Your Choice: 7
Linked List: 9->30->10->20->11->40->NULL
Enter Your Choice: 4
Element Deleted: 9
Enter Your Choice: 4
Element Deleted: 30
Enter Your Choice: 5
Element Deleted: 40
Enter Your Choice: 7
Linked List: 10->20->11->NULL
Enter Your Choice: 6
Enter Position ( zero-indexed ): 1
Element Deleted: 20
Enter Your Choice: 7
Linked List: 10->11->NULL
Enter Your Choice: 0
References