You will be given a linked list each of whose nodes will be represented by the following structure

Add two numbers represented by linked lists | Set 1

Given two numbers represented by two lists, write a function that returns the sum list. The sum list is a list representation of the addition of two input numbers.

Example:

Input:
List1: 5->6->3 // represents number 563
List2: 8->4->2 // represents number 842
Output:
Resultant list: 1->4->0->5 // represents number 1405
Explanation: 563 + 842 = 1405

Input:
List1: 7->5->9->4->6 // represents number 75946
List2: 8->4 // represents number 84
Output:
Resultant list: 7->6->0->3->0// represents number 76030
Explanation: 75946+84=76030

Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

Approach: Traverse both lists to the end and add preceding zeros in the list with lesser digits. Then call a recursive function on the start nodes of both lists which calls itself for the next nodes of both lists till it gets to the end. This function creates a node for the sum of the current digits and returns the carry.



The steps are:

  1. Traverse the two linked lists in order to add preceding zeros in case a list is having lesser digits than the other one.
  2. Start from the head node of both lists and call a recursive function for the next nodes.
  3. Continue it till the end of the lists.
  4. Creates a node for current digits sum and returns the carry.

Below is the implementation of this approach.

C++




// C++ program to add two numbers
// represented by linked list
#include
using namespace std;
/* Linked list node */
class Node {
public:
int data;
Node* next;
};
/* Function to create a
new node with given data */
Node* newNode[int data]
{
Node* new_node = new Node[];
new_node->data = data;
new_node->next = NULL;
return new_node;
}
/* Function to insert a node at the
beginning of the Singly Linked List */
void push[Node** head_ref, int new_data]
{
/* allocate node */
Node* new_node = newNode[new_data];
/* link the old list off the new node */
new_node->next = [*head_ref];
/* move the head to point to the new node */
[*head_ref] = new_node;
}
/* Adds contents of two linked lists and
return the head node of resultant list */
Node* addTwoLists[Node* first, Node* second]
{
// res is head node of the resultant list
Node* res = NULL;
Node *temp, *prev = NULL;
int carry = 0, sum;
// while both lists exist
while [first != NULL
|| second != NULL] {
// Calculate value of next
// digit in resultant list.
// The next digit is sum of
// following things
// [i] Carry
// [ii] Next digit of first
// list [if there is a next digit]
// [ii] Next digit of second
// list [if there is a next digit]
sum = carry + [first ? first->data : 0]
+ [second ? second->data : 0];
// update carry for next calculation
carry = [sum >= 10] ? 1 : 0;
// update sum if it is greater than 10
sum = sum % 10;
// Create a new node with sum as data
temp = newNode[sum];
// if this is the first node then
// set it as head of the resultant list
if [res == NULL]
res = temp;
// If this is not the first
// node then connect it to the rest.
else
prev->next = temp;
// Set prev for next insertion
prev = temp;
// Move first and second
// pointers to next nodes
if [first]
first = first->next;
if [second]
second = second->next;
}
if [carry > 0]
temp->next = newNode[carry];
// return head of the resultant list
return res;
}
Node* reverse[Node* head]
{
if [head == NULL || head->next == NULL]
return head;
/* reverse the rest list and put
the first element at the end */
Node* rest = reverse[head->next];
head->next->next = head;
head->next = NULL;
/* fix the head pointer */
return rest;
}
// A utility function to print a linked list
void printList[Node* node]
{
while [node != NULL] {
cout data next;
}
cout 5->9->4->6
push[&first, 6];
push[&first, 4];
push[&first, 9];
push[&first, 5];
push[&first, 7];
printf["First List is "];
printList[first];
// create second list 8->4
push[&second, 4];
push[&second, 8];
cout next = NULL;
return new_node;
}
/* Function to insert a node
at the beginning of the Singly Linked List */
void push[struct Node** head_ref, int new_data]
{
/* allocate node */
struct Node* new_node = newNode[new_data];
/* link the old list off the new node */
new_node->next = [*head_ref];
/* move the head to point to the new node */
[*head_ref] = new_node;
}
/* Adds contents of two linked
lists and return the head node
of resultant list */
struct Node* addTwoLists[struct Node* first,
struct Node* second]
{
// res is head node of the resultant list
struct Node* res = NULL;
struct Node *temp, *prev = NULL;
int carry = 0, sum;
// while both lists exist
while [first != NULL || second != NULL] {
// Calculate value of next
// digit in resultant list.
// The next digit is sum
// of following things
// [i] Carry
// [ii] Next digit of first
// list [if there is a next digit]
// [ii] Next digit of second
// list [if there is a next digit]
sum = carry + [first ? first->data : 0]
+ [second ? second->data : 0];
// Update carry for next calculation
carry = [sum >= 10] ? 1 : 0;
// Update sum if it is greater than 10
sum = sum % 10;
// Create a new node with sum as data
temp = newNode[sum];
// if this is the first node then
// set it as head of the resultant list
if [res == NULL]
res = temp;
// If this is not the first node
// then connect it to the rest.
else
prev->next = temp;
// Set prev for next insertion
prev = temp;
// Move first and second
// pointers to next nodes
if [first]
first = first->next;
if [second]
second = second->next;
}
if [carry > 0]
temp->next = newNode[carry];
// return head of the resultant list
return res;
}
// A utility function to print a linked list
void printList[struct Node* node]
{
while [node != NULL] {
printf["%d ", node->data];
node = node->next;
}
printf["\n"];
}
/* Driver code */
int main[void]
{
struct Node* res = NULL;
struct Node* first = NULL;
struct Node* second = NULL;
// create first list 7->5->9->4->6
push[&first, 6];
push[&first, 4];
push[&first, 9];
push[&first, 5];
push[&first, 7];
printf["First List is "];
printList[first];
// create second list 8->4
push[&second, 4];
push[&second, 8];
printf["Second List is "];
printList[second];
// Add the two lists and see result
res = addTwoLists[first, second];
printf["Resultant list is "];
printList[res];
return 0;
}
Java




// Java program to add two numbers
// represented by linked list
class LinkedList {
static Node head1, head2;
static class Node {
int data;
Node next;
Node[int d] {
data = d;
next = null;
}
}
/* Adds contents of two linked lists and prints it */
void addTwoLists[Node first, Node second] {
Node start1 = new Node[0];
start1.next = first;
Node start2 = new Node[0];
start2.next = second;
addPrecedingZeros[start1, start2];
Node result = new Node[0];
if [sumTwoNodes[start1.next, start2.next, result] == 1] {
Node node = new Node[1];
node.next = result.next;
result.next = node;
}
printList[result.next];
}
/* Adds lists and returns the carry */
private int sumTwoNodes[Node first, Node second, Node result] {
if [first == null] {
return 0;
}
int number = first.data + second.data + sumTwoNodes[first.next, second.next, result];
Node node = new Node[number % 10];
node.next = result.next;
result.next = node;
return number / 10;
}
/* Appends preceding zeros in case a list is having lesser nodes than the other one*/
private void addPrecedingZeros[Node start1, Node start2] {
Node next1 = start1.next;
Node next2 = start2.next;
while [next1 != null && next2 != null] {
next1 = next1.next;
next2 = next2.next;
}
if [next1 == null && next2 != null] {
while [next2 != null] {
Node node = new Node[0];
node.next = start1.next;
start1.next = node;
next2 = next2.next;
}
} else if [next2 == null && next1 != null] {
while [next1 != null] {
Node node = new Node[0];
node.next = start2.next;
start2.next = node;
next1 = next1.next;
}
}
}
/* Utility function to print a linked list */
void printList[Node head] {
while [head != null] {
System.out.print[head.data + " "];
head = head.next;
}
System.out.println[""];
}
// Driver Code
public static void main[String[] args] {
LinkedList list = new LinkedList[];
// creating first list
list.head1 = new Node[7];
list.head1.next = new Node[5];
list.head1.next.next = new Node[9];
list.head1.next.next.next = new Node[4];
list.head1.next.next.next.next = new Node[6];
System.out.print["First List is "];
list.printList[head1];
// creating second list
list.head2 = new Node[8];
list.head2.next = new Node[4];
System.out.print["Second List is "];
list.printList[head2];
System.out.print["Resultant List is "];
// add the two lists and see the result
list.addTwoLists[head1, head2];
}
// this code is contributed by *Saurabh321Gupta*
}
Python3




# Python program to add two numbers represented by linked list
# Node class
class Node:
# Constructor to initialize the node object
def __init__[self, data]:
self.data = data
self.next = None
class LinkedList:
# Function to initialize head
def __init__[self]:
self.head = None
# Function to insert a new node at the beginning
def push[self, new_data]:
new_node = Node[new_data]
new_node.next = self.head
self.head = new_node
# Add contents of two linked lists and return the head
# node of resultant list
def addTwoLists[self, first, second]:
prev = None
temp = None
carry = 0
# While both list exists
while[first is not None or second is not None]:
# Calculate the value of next digit in
# resultant list
# The next digit is sum of following things
# [i] Carry
# [ii] Next digit of first list [if ther is a
# next digit]
# [iii] Next digit of second list [ if there
# is a next digit]
fdata = 0 if first is None else first.data
sdata = 0 if second is None else second.data
Sum = carry + fdata + sdata
# update carry for next calculation
carry = 1 if Sum >= 10 else 0
# update sum if it is greater than 10
Sum = Sum if Sum < 10 else Sum % 10
# Create a new node with sum as data
temp = Node[Sum]
# if this is the first node then set it as head
# of resultant list
if self.head is None:
self.head = temp
else:
prev.next = temp
# Set prev for next insertion
prev = temp
# Move first and second pointers to next nodes
if first is not None:
first = first.next
if second is not None:
second = second.next
if carry > 0:
temp.next = Node[carry]
# Utility function to print the linked LinkedList
def printList[self]:
temp = self.head
while[temp]:
print [temp.data,end=' ']
temp = temp.next
# Driver code
first = LinkedList[]
second = LinkedList[]
# Create first list
first.push[6]
first.push[4]
first.push[9]
first.push[5]
first.push[7]
print ["First List is ",end=' ']
first.printList[]
# Create second list
second.push[4]
second.push[8]
print ["\nSecond List is",end=' ']
second.printList[]
# Add the two lists and see result
res = LinkedList[]
res.addTwoLists[first.head, second.head]
print ["\nResultant list is",end=' ']
res.printList[]
# This code is contributed by Nikhil Kumar Singh[nickzuck_007]
C#




// C# program to add two numbers
// represented by linked list
using System;
public class LinkedList {
Node head1, head2;
public class Node {
public int data;
public Node next;
public Node[int d]
{
data = d;
next = null;
}
}
/* Adds contents of two linked lists
and return the head node of resultant list */
Node addTwoLists[Node first, Node second]
{
// res is head node of the resultant list
Node res = null;
Node prev = null;
Node temp = null;
int carry = 0, sum;
// while both lists exist
while [first != null || second != null] {
// Calculate value of next digit in resultant
// list. The next digit is sum of following
// things [i] Carry [ii] Next digit of first
// list [if there is a next digit] [ii] Next
// digit of second list [if there is a next
// digit]
sum = carry + [first != null ? first.data : 0]
+ [second != null ? second.data : 0];
// update carry for next calculation
carry = [sum >= 10] ? 1 : 0;
// update sum if it is greater than 10
sum = sum % 10;
// Create a new node with sum as data
temp = new Node[sum];
// if this is the first node then set it as head
// of the resultant list
if [res == null] {
res = temp;
}
// If this is not the first
// node then connect it to the rest.
else {
prev.next = temp;
}
// Set prev for next insertion
prev = temp;
// Move first and second pointers to next nodes
if [first != null] {
first = first.next;
}
if [second != null] {
second = second.next;
}
}
if [carry > 0] {
temp.next = new Node[carry];
}
// return head of the resultant list
return res;
}
/* Utility function to print a linked list */
void printList[Node head]
{
while [head != null] {
Console.Write[head.data + " "];
head = head.next;
}
Console.WriteLine[""];
}
// Driver code
public static void Main[String[] args]
{
LinkedList list = new LinkedList[];
// creating first list
list.head1 = new Node[7];
list.head1.next = new Node[5];
list.head1.next.next = new Node[9];
list.head1.next.next.next = new Node[4];
list.head1.next.next.next.next = new Node[6];
Console.Write["First List is "];
list.printList[list.head1];
// creating second list
list.head2 = new Node[8];
list.head2.next = new Node[4];
Console.Write["Second List is "];
list.printList[list.head2];
// add the two lists and see the result
Node rs = list.addTwoLists[list.head1, list.head2];
Console.Write["Resultant List is "];
list.printList[rs];
}
}
// This code contributed by Rajput-Ji
Javascript




// Javascript program to add two numbers
// represented by linked list
var head1, head2;
class Node {
constructor[val] {
this.data = val;
this.next = null;
}
}
/*
Adds contents of two linked lists and return
the head node of resultant list
*/
function addTwoLists[ first, second] {
// res is head node of the resultant list
var res = null;
var prev = null;
var temp = null;
var carry = 0, sum;
// while both lists exist
while [first != null || second != null] {
// Calculate value of next
// digit in resultant list.
// The next digit is sum
// of following things
// [i] Carry
// [ii] Next digit of first
// list [if there is a next digit]
// [ii] Next digit of second
// list [if there is a next digit]
sum = carry + [first != null ? first.data : 0] +
[second != null ? second.data : 0];
// update carry for next calculation
carry = [sum >= 10] ? 1 : 0;
// update sum if it is greater than 10
sum = sum % 10;
// Create a new node with sum as data
temp = new Node[sum];
// if this is the first node then set
// it as head of the resultant list
if [res == null] {
res = temp;
}
// If this is not the first
// node then connect it to the rest.
else {
prev.next = temp;
}
// Set prev for next insertion
prev = temp;
// Move first and second pointers
// to next nodes
if [first != null] {
first = first.next;
}
if [second != null] {
second = second.next;
}
}
if [carry > 0] {
temp.next = new Node[carry];
}
// return head of the resultant list
return res;
}
/* Utility function to print a linked list */
function printList[ head] {
while [head != null] {
document.write[head.data + " "];
head = head.next;
}
document.write["
"];
}
// Driver Code
// creating first list
head1 = new Node[7];
head1.next = new Node[5];
head1.next.next = new Node[9];
head1.next.next.next = new Node[4];
head1.next.next.next.next = new Node[6];
document.write["First List is "];
printList[head1];
// creating second list
head2 = new Node[8];
head2.next = new Node[4];
document.write["Second List is "];
printList[head2];
// add the two lists and see the result
rs = addTwoLists[head1, head2];
document.write["Resultant List is "];
printList[rs];
// This code contributed by aashish2995
Output First List is 7 5 9 4 6 Second List is 8 4 Resultant list is 5 0 0 5 6

Complexity Analysis:

  • Time Complexity: O[m + n], where m and n are numbers of nodes in first and second lists respectively.
    The lists need to be traversed only once.
  • Space Complexity: O[m + n].
    A temporary linked list is needed to store the output number

Method 2[Using STL]: Using the stack data structure

Approach :

  • Create 3 stacks namely s1,s2,s3.
  • Fill s1 with Nodes of list1 and fill s2 with nodes of list2.
  • Fill s3 by creating new nodes and setting the data of new nodes to the sum of s1.top[], s2.top[] and carry until list1 and list2 are empty .
  • If the sum >9
    • set carry 1
  • else
    • set carry 0
  • Create a Node[say prev] that will contain the head of the sum List.
  • Link all the elements of s3 from top to bottom
  • return prev

Code:

C++




// C++ program to add two numbers represented by Linked
// Lists using Stack
#include
using namespace std;
class Node {
public:
int data;
Node* next;
};
Node* newnode[int data]
{
Node* x = new Node[];
x->data = data;
return x;
}
// function that returns the sum of two numbers represented
// by linked lists
Node* addTwoNumbers[Node* l1, Node* l2]
{
Node* prev = NULL;
// Create 3 stacks
stack s1, s2, s3;
// Fill first stack with first List Elements
while [l1 != NULL] {
s1.push[l1];
l1 = l1->next;
}
// Fill second stack with second List Elements
while [l2 != NULL] {
s2.push[l2];
l2 = l2->next;
}
int carry = 0;
// Fill the third stack with the sum of first and second
// stack
while [!s1.empty[] && !s2.empty[]] {
int sum = s1.top[]->data + s2.top[]->data + carry;
Node* temp = newnode[sum % 10];
s3.push[temp];
if [sum > 9] {
carry = 1;
}
else {
carry = 0;
}
s1.pop[];
s2.pop[];
}
while [!s1.empty[]] {
int sum = carry + s1.top[]->data;
Node* temp = newnode[sum % 10];
s3.push[temp];
if [sum > 9] {
carry = 1;
}
else {
carry = 0;
}
s1.pop[];
}
while [!s2.empty[]] {
int sum = carry + s2.top[]->data;
Node* temp = newnode[sum % 10];
s3.push[temp];
if [sum > 9] {
carry = 1;
}
else {
carry = 0;
}
s2.pop[];
}
// If carry is still present create a new node with
// value 1 and push it to the third stack
if [carry == 1] {
Node* temp = newnode[1];
s3.push[temp];
}
// Link all the elements inside third stack with each
// other
if [!s3.empty[]]
prev = s3.top[];
while [!s3.empty[]] {
Node* temp = s3.top[];
s3.pop[];
if [s3.size[] == 0] {
temp->next = NULL;
}
else {
temp->next = s3.top[];
}
}
return prev;
}
// utility functions
// Function that displays the List
void Display[Node* head]
{
if [head == NULL] {
return;
}
while [head->next != NULL] {
cout data next;
}
cout data next = NULL;
if [*head_ref == NULL] {
new_node->next = *head_ref;
*head_ref = new_node;
return;
}
Node* last = *head_ref;
while [last->next != NULL && last != NULL] {
last = last->next;
}
last->next = new_node;
return;
}
// Driver Program for above Functions
int main[]
{
// Creating two lists
// first list = 9 -> 5 -> 0
// second List = 6 -> 7
Node* first = NULL;
Node* second = NULL;
Node* sum = NULL;
push[&first, 9];
push[&first, 5];
push[&first, 0];
push[&second, 6];
push[&second, 7];
cout 7 Sum List : 1 -> 0 -> 1 -> 7

Another Approach with time complexity O[N]:

The given approach works as following steps:

  1. First, we calculate the sizes of both the linked lists, size1 and size2, respectively.
  2. Then we traverse the bigger linked list, if any, and decrement till the size of both become the same.
  3. Now we traverse both linked lists till the end.
  4. Now the backtracking occurs while performing addition.
  5. Finally, the head node is returned to the linked list containing the answer.
C++




#include
using namespace std;
struct Node {
int data;
struct Node* next;
};
// recursive function
Node* addition[Node* temp1, Node* temp2, int size1,
int size2]
{
// creating a new Node
Node* newNode
= [struct Node*]malloc[sizeof[struct Node]];
// base case
if [temp1->next == NULL && temp2->next == NULL] {
// addition of current nodes which is the last nodes
// of both linked lists
newNode->data = [temp1->data + temp2->data];
// set this current node's link null
newNode->next = NULL;
// return the current node
return newNode;
}
// creating a node that contains sum of previously added
// number
Node* returnedNode
= [struct Node*]malloc[sizeof[struct Node]];
// if sizes are same then we move in both linked list
if [size2 == size1] {
// recursively call the function
// move ahead in both linked list
returnedNode = addition[temp1->next, temp2->next,
size1 - 1, size2 - 1];
// add the current nodes and append the carry
newNode->data = [temp1->data + temp2->data]
+ [[returnedNode->data] / 10];
}
// or else we just move in big linked list
else {
// recursively call the function
// move ahead in big linked list
returnedNode = addition[temp1, temp2->next, size1,
size2 - 1];
// add the current node and carry
newNode->data
= [temp2->data] + [[returnedNode->data] / 10];
}
// this node contains previously added numbers
// so we need to set only rightmost digit of it
returnedNode->data = [returnedNode->data] % 10;
// set the returned node to the current node
newNode->next = returnedNode;
// return the current node
return newNode;
}
// Function to add two numbers represented by nexted list.
struct Node* addTwoLists[struct Node* head1,
struct Node* head2]
{
struct Node *temp1, *temp2, *ans = NULL;
temp1 = head1;
temp2 = head2;
int size1 = 0, size2 = 0;
// calculating the size of first linked list
while [temp1 != NULL] {
temp1 = temp1->next;
size1++;
}
// calculating the size of second linked list
while [temp2 != NULL] {
temp2 = temp2->next;
size2++;
}
Node* returnedNode
= [struct Node*]malloc[sizeof[struct Node]];
// traverse the bigger linked list
if [size2 > size1] {
returnedNode = addition[head1, head2, size1, size2];
}
else {
returnedNode = addition[head2, head1, size2, size1];
}
// creating new node if head node is >10
if [returnedNode->data >= 10] {
ans = [struct Node*]malloc[sizeof[struct Node]];
ans->data = [returnedNode->data] / 10;
returnedNode->data = returnedNode->data % 10;
ans->next = returnedNode;
}
else
ans = returnedNode;
// return the head node of linked list that contains
// answer
return ans;
}
void Display[Node* head]
{
if [head == NULL] {
return;
}
while [head->next != NULL] {
cout data next;
}
cout data data = d;
new_node->next = NULL;
if [*head_ref == NULL] {
new_node->next = *head_ref;
*head_ref = new_node;
return;
}
Node* last = *head_ref;
while [last->next != NULL && last != NULL] {
last = last->next;
}
last->next = new_node;
return;
}
// Driver Program for above Functions
int main[]
{
// Creating two lists
Node* first = NULL;
Node* second = NULL;
Node* sum = NULL;
push[&first, 5];
push[&first, 6];
push[&first, 3];
push[&second, 8];
push[&second, 4];
push[&second, 2];
cout 4 -> 2 Sum List : 1 -> 4 -> 0 -> 5

Related Article: Add two numbers represented by linked lists | Set 2

Please write comments if you find the above codes/algorithms incorrect, or find other ways to solve the same problem.




Article Tags :
Linked List
Accolite
Amazon
Flipkart
MakeMyTrip
Microsoft
Qualcomm
Snapdeal
Practice Tags :
Flipkart
Accolite
Amazon
Microsoft
Snapdeal
MakeMyTrip
Qualcomm
Linked List
Read Full Article

Answer to Question #226773 in Python for Rahul

2021-08-16T16:24:47-04:00
Answers>
Programming & Computer Science>
Python
Question #226773
There is a singly linked list represented by the following structure:
struct Node int data;
struct Node* next;
Implement the following function:
struct Node
DeleteNodes [struct Node* head];
The function accepts a pointer to the start of the linked list, 'head' argument. Delete all such nodes from the input list whose adjacent on the right side has greater value and return the modified linked list. Note: . Return null if the list is empty [Incase of python if the list is No return None]. Do not create a new linked list, just modify the input linked list an . return it. Example: Input: head: 6->2->5->4->9->7->2>1>5->9 Output: 65-9->7->2->9 Explanation: Node '2' is deleted as '2' < '5' then '4' is deleted as '4' < '9' then '1' deleted as '1' < '5' then '5' is deleted as '5' < '9'. Sample Input head: 9- 5 - 6 - 2 -> 7 Sample Output​
1
Expert's answer
2021-08-17T12:54:42-0400
#include #include struct Node{ int data; struct Node *next; }; int size[struct Node* newNode]{ int count=0; while[newNode!=NULL]{ newNode = newNode->next; count++; } return count; } void push[struct Node** head1, int item]{ struct Node* newNode = [struct Node*] malloc[sizeof[struct Node]]; newNode->data = item; newNode->next = *head1; *head1 = newNode; } void delete[struct Node** head1, int position] { struct Node* tempData = *head1; struct Node* prev; //Deleting the head node if needed int s = size[*head1]; if[positions]{ printf["Invalid position\n"]; return; } if[position==1] { *head1 = tempData->next; free[tempData]; return; } while [--position] { prev = tempData; tempData = tempData->next; } prev->next = tempData->next; free[tempData]; } void displayList[struct Node* newNode]{ while[newNode!=NULL] { printf["%d->",newNode->data]; newNode = newNode->next; } printf["\n\n"]; } void DeleteNodes[struct Node* head1]{ struct Node* head2 = head1; int count=0; int i = 1; while[head1!=NULL]{ int m = head1->data; head1 = head1->next; int n = head1->data; head1 = head1->next; if[mdata]; i++; count++; } while[head2 != NULL]{ printf["%d->",head2->data]; head2 = head2->next; } printf["\n\nCount is\t%d\n",count]; } int main[] { struct Node* head = NULL; push[&head,9]; push[&head,5]; push[&head,1]; push[&head,2]; push[&head,7]; push[&head,9]; push[&head,4]; push[&head,5]; push[&head,2]; push[&head,6]; printf["\nSample input\n"]; displayList[head]; printf["\nSample output\n"]; DeleteNodes[head]; return 0; }

Need a fast expert's response?

Submit order

and get a quick answer at the best price

for any assignment or question with DETAILED EXPLANATIONS!

Place free inquiry
Calculate the price
Learn more about our help with Assignments: Python

Comments

No comments. Be the first!

Leave a comment

Thank you! Your comments have been successfully added. However, they need to be checked by the moderator before being published.
Post

Ask Your question

Ask

Related Questions

  • 1. 1. Edit, Debug and Run the given Python script files: TP1.py 2. The Evaluator will allocate marks b
  • 2. Edit, Debug and Run the given Python script files """In distributed systems, it is a
  • 3. To fork a process is to create a second exact replica of the given process. i.e., When we fork somet
  • 4. Ordered MatrixGiven a M x N matrix, write a program to print the matrix after ordering all the eleme
  • 5. Given polynomial, write a program that prints poly in Cix^Pi + Ci-1x^Pi-1 + ..+ C1x + C0 format.I/pT
  • 6. First Prime NumberYou are given N inputs. Write a program to print the first prime number in the giv
  • 7. Composite Numbers in the rangeYou are given two integers M, N as input. Write a program to print all

Linked List In C++

We will take a look at the singly linked list in detail in this tutorial.

The following diagram shows the structure of a singly linked list.

As shown above, the first node of the linked list is called “head” while the last node is called “Tail”. As we see, the last node of the linked list will have its next pointer as null since it will not have any memory address pointed to.

Since each node has a pointer to the next node, data items in the linked list need not be stored at contiguous locations. The nodes can be scattered in the memory. We can access the nodes anytime as each node will have an address of the next node.

We can add data items to the linked list as well as delete items from the list easily. Thus it is possible to grow or shrink the linked list dynamically. There is no upper limit on how many data items can be there in the linked list. So as long as memory is available, we can have as many data items added to the linked list.

Apart from easy insertion and deletion, the linked list also doesn’t waste memory space as we need not specify beforehand how many items we need in the linked list. The only space taken by linked list is for storing the pointer to the next node that adds a little overhead.

Next, we will discuss the various operations that can be performed on a linked list.

Operations

Just like the other data structures, we can perform various operations for the linked list as well. But unlike arrays, in which we can access the element using subscript directly even if it is somewhere in between, we cannot do the same random access with a linked list.

In order to access any node, we need to traverse the linked list from the start and only then we can access the desired node. Hence accessing the data randomly from the linked list proves to be expensive.

We can perform various operations on a linked list as given below:

#1] Insertion

Insertion operation of linked list adds an item to the linked list. Though it may sound simple, given the structure of the linked list, we know that whenever a data item is added to the linked list, we need to change the next pointers of the previous and next nodes of the new item that we have inserted.

The second thing that we have to consider is the place where the new data item is to be added.

There are three positions in the linked list where a data item can be added.

#1] At the beginning of the linked list

A linked list is shown below 2->4->6->8->10. If we want to add a new node 1, as the first node of the list, then the head pointing to node 2 will now point to 1 and the next pointer of node 1 will have a memory address of node 2 as shown in the below figure.

Thus the new linked list becomes 1->2->4->6->8->10.

#2] After the given Node

Here, a node is given and we have to add a new node after the given node. In the below-linked list a->b->c->d ->e, if we want to add a node f after node c then the linked list will look as follows:

Thus in the above diagram, we check if the given node is present. If it’s present, we create a new node f. Then we point the next pointer of node c to point to the new node f. The next pointer of the node f now points to node d.

#3] At the end of the Linked List

In the third case, we add a new node at the end of the linked list. Consider we have the same linked list a->b->c->d->e and we need to add a node f to the end of the list. The linked list will look as shown below after adding the node.

Thus we create a new node f. Then the tail pointer pointing to null is pointed to f and the next pointer of node f is pointed to null. We have implemented all three types of insert functions in the below C++ program.

In C++, we can declare a linked list as a structure or as a class. Declaring linked list as a structure is a traditional C-style declaration. A linked list as a class is used in modern C++, mostly while using standard template library.

In the following program, we have used structure to declare and create a linked list. It will have data and pointer to the next element as its members.

#include using namespace std; // A linked list node struct Node { int data; struct Node *next; }; //insert a new node in front of the list void push[struct Node** head, int node_data] { /* 1. create and allocate node */ struct Node* newNode = new Node; /* 2. assign data to node */ newNode->data = node_data; /* 3. set next of new node as head */ newNode->next = [*head]; /* 4. move the head to point to the new node */ [*head] = newNode; } //insert new node after a given node void insertAfter[struct Node* prev_node, int node_data] { /*1. check if the given prev_node is NULL */if [prev_node == NULL] { coutnext = prev_node->next; /* 5. move the next of prev_node as new_node */ prev_node->next = newNode; } /* insert new node at the end of the linked list */void append[struct Node** head, int node_data] { /* 1. create and allocate node */struct Node* newNode = new Node; struct Node *last = *head; /* used in step 5*/ /* 2. assign data to the node */newNode->data = node_data; /* 3. set next pointer of new node to null as its the last node*/newNode->next = NULL; /* 4. if list is empty, new node becomes first node */if [*head == NULL] { *head = newNode; return; } /* 5. Else traverse till the last node */while [last->next != NULL] last = last->next; /* 6. Change the next of last node */last->next = newNode; return; } // display linked list contents void displayList[struct Node *node] { //traverse the list to display each node while [node != NULL] { coutnext is the new node. prev_node.next = newNode; } //inserts a new node at the end of the list public void append[intnew_data] { //allocate the node and assign data Node newNode = new Node[new_data]; //if linked list is empty, then new node will be the head if [head == null] { head = new Node[new_data]; return; } //set next of new node to null as this is the last node newNode.next = null; // if not the head node traverse the list and add it to the last Node last = head; while [last.next != null] last = last.next; //next of last becomes new node last.next = newNode; return; } //display contents of linked list public void displayList[] { Node pnode = head; while [pnode != null] { System.out.print[pnode.data+"-->"]; pnode = pnode.next; } if[pnode == null] System.out.print["null"]; } } //Main class to call linked list class functions and construct a linked list class Main{ public static void main[String[] args] { /* create an empty list */ LinkedList lList = new LinkedList[]; // Insert 40. lList.append[40]; // Insert 20 at the beginning. lList.push[20]; // Insert 10 at the beginning. lList.push[10]; // Insert 50 at the end. lList.append[50]; // Insert 30, after 20. lList.insertAfter[lList.head.next, 30]; System.out.println["\nFinal linked list: "]; lList. displayList []; } }

Output:

Finallinkedlist:

10–>20–>30–>40–>50–>null

In both the program above, C++ as well as Java, we have separate functions to add a node in front of the list, end of the list and between the lists given in a node. In the end, we print the contents of the list created using all the three methods.

#2] Deletion

Like insertion, deleting a node from a linked list also involves various positions from where the node can be deleted. We can delete the first node, last node or a random kth node from the linked list. After deletion, we need to adjust the next pointer and the other pointers in the linked list appropriately so as to keep the linked list intact.

In the following C++ implementation, we have given two methods of deletion i.e. deleting the first node in the list and deleting the last node in the list. We first create a list by adding nodes to the head. Then we display the contents of the list after insertion and each deletion.

#include using namespace std; /* Link list node */struct Node { int data; struct Node* next; }; //delete first node in the linked list Node* deleteFirstNode[struct Node* head] { if [head == NULL] return NULL; // Move the head pointer to the next node Node* tempNode = head; head = head->next; delete tempNode; return head; } //delete last node from linked list Node* removeLastNode[struct Node* head] { if [head == NULL] return NULL; if [head->next == NULL] { delete head; return NULL; } // first find second last node Node* second_last = head; while [second_last->next->next != NULL] second_last = second_last->next; // Delete the last node delete [second_last->next]; // set next of second_last to null second_last->next = NULL; return head; } // create linked list by adding nodes at head void push[struct Node** head, int new_data] { struct Node* newNode = new Node; newNode->data = new_data; newNode->next = [*head]; [*head] = newNode; } // main function int main[] { /* Start with the empty list */ Node* head = NULL; // create linked list push[&head, 2]; push[&head, 4]; push[&head, 6]; push[&head, 8]; push[&head, 10]; Node* temp; cout1–
>null

Linkedlistafterdeletingheadnode:

7–>5–>3–>1–
>null

Linkedlistafterdeletinglastnode:

7–>5–>3–>null

Count The Number Of Nodes

The operation to count the number of nodes can be performed while traversing the linked list. We have already seen in the implementation above that whenever we need to insert/delete a node or display contents of the linked list, we need to traverse the linked list from start.

Keeping a counter and incrementing it as we traverse each node will give us the count of the number of nodes present in the linked list. We will leave this program for the readers to implement.

Arrays And Linked Lists

Having seen the operations and implementation of the linked list, let us compare how arrays and linked list fair in comparison with each other.

ArraysLinked lists
Arrays have fixed sizeLinked list size is dynamic
Insertion of new element is expensiveInsertion/deletion is easier
Random access is allowedRandom access not possible
Elements are at contiguous locationElements have non-contiguous location
No extra space is required for the next pointerExtra memory space required for next pointer

Applications

As arrays and linked lists are both used to store items and are linear data structures, both these structures can be used in similar ways for most of the applications.

Some of the applications for linked lists are as follows:

  • A linked list can be used to implement stacks and queues.
  • A linked list can also be used to implement graphs whenever we have to represent graphs as adjacency lists.
  • A mathematical polynomial can be stored as a linked list.
  • In the case of hashing technique, the buckets used in hashing are implemented using the linked lists.
  • Whenever a program requires dynamic allocation of memory, we can use a linked list as linked lists work more efficiently in this case.

Conclusion

Linked lists are the data structures that are used to store data items in a linear fashion but noncontiguous locations. A linked list is a collection of nodes that contain a data part and a next pointer that contains the memory address of the next element in the list.

The last element in the list has its next pointer set to NULL, thereby indicating the end of the list. The first element of the list is called the Head. The linked list supports various operations like insertion, deletion, traversal, etc. In case of dynamic memory allocation, linked lists are preferred over arrays.

Linked lists are expensive as far as their traversal is concerned since we cannot randomly access the elements like arrays. However, insertion-deletion operations are less expensive when compared arrays.

We have learned all about linear linked lists in this tutorial. Linked lists can also be circular or doubly. We will have an in-depth look at these lists in our upcoming tutorials.

=> Check Here For Complete C++ Training Series.

Recommended Reading

  • Circular Linked List Data Structure In C++ With Illustration
  • Doubly Linked List Data Structure In C++ With Illustration
  • Queue Data Structure In C++ With Illustration
  • Stack Data Structure In C++ With Illustration
  • Priority Queue Data Structure In C++ With Illustration
  • Top 15 Best Free Data Mining Tools: The Most Comprehensive List
  • 15 Best ETL Tools in 2022 [A Complete Updated List]
  • Introduction To Data Structures In C++

Video liên quan

Bài Viết Liên Quan

Bài mới nhất

Chủ Đề