Number is represented in linked list such that each digit corresponds to a node in linked list. Add 1 to it. For example 1999 is represented as (1-> 9-> 9 -> 9) and adding 1 to it should change it to (2->0->0->0)
Below are the steps :
- Reverse given linked list. For example, 1-> 9-> 9 -> 9 is converted to 9-> 9 -> 9 ->1.
- Start traversing linked list from leftmost node and add 1 to it. If there is a carry, move to the next node. Keep moving to the next node while there is a carry.
- Reverse modified linked list and return head.
Below is the implementation of above steps.
// C++ program to add 1 to a // linked list #include <bits/stdc++.h> 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 reverse the linked list Node *reverse(Node *head) { Node * prev = NULL;
Node * current = head;
Node * next;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
} /* Adds one to a linked lists and return the head node of resultant
list */
Node *addOneUtil(Node *head) { // res is head node of the
// resultant list
Node* res = head;
Node *temp, *prev = NULL;
int carry = 1, sum;
// while both lists exist
while (head != NULL)
{
// Calculate value of next digit
// in resultant list. The next digit
// is sum of following things
// (i) Carry
// (ii) Next digit of head list (if
// there is a next digit)
sum = carry + head->data;
// 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
head->data = sum;
// Move head and second pointers
// to next nodes
temp = head;
head = head->next;
}
// If some carry is still there, add
// a new node to result list.
if (carry > 0)
temp->next = newNode(carry);
// return head of the resultant list
return res;
} // This function mainly uses addOneUtil(). Node* addOne(Node *head) { // Reverse linked list
head = reverse(head);
// Add one from left to right of
// reversed list
head = addOneUtil(head);
// Reverse the modified list
return reverse(head);
} // A utility function to print a // linked list void printList(Node *node)
{ while (node != NULL)
{
cout << node->data;
node = node->next;
}
cout<<endl;
} // Driver code int main( void )
{ Node *head = newNode(1);
head->next = newNode(9);
head->next->next = newNode(9);
head->next->next->next = newNode(9);
cout << "List is " ;
printList(head);
head = addOne(head);
cout << "Resultant list is " ;
printList(head);
return 0;
} // This is code is contributed by rathbhupendra |
Output:
List is 1999 Resultant list is 2000
Time Complexity: O(n), n is the number of elements in the linked list.
Auxiliary Space: O(1), as we are not taking any extra space.
Recursive Implementation:
We can recursively reach the last node and forward carry to previous nodes. A recursive solution doesn’t require reversing of linked list. We can also use a stack in place of recursion to temporarily hold nodes.
Below is the implementation of the recursive solution:
// Recursive C++ program to add 1 to // a linked list #include <bits/stdc++.h> // Linked list node struct Node
{ 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;
} // Recursively add 1 from end to // beginning and returns carry // after all nodes are processed. int addWithCarry(Node* head)
{ // If linked list is empty,
// then return carry
if (head == NULL)
return 1;
// Add carry returned be next
// node call
int res = head->data + addWithCarry(head->next);
// Update data and return new carry
head->data = (res) % 10;
return (res) / 10;
} // This function mainly uses addWithCarry(). Node* addOne(Node* head) { // Add 1 to linked list from end
// to beginning
int carry = addWithCarry(head);
// If there is carry after processing
// all nodes, then we need to add a
// new node to linked list
if (carry)
{
Node* newNode = new Node;
newNode->data = carry;
newNode->next = head;
// New node becomes head now
return newNode;
}
return head;
} // A utility function to print // a linked list void printList(Node* node)
{ while (node != NULL)
{
printf ( "%d" , node->data);
node = node->next;
}
printf ( "" );
} // Driver code int main( void )
{ Node* head = newNode(1);
head->next = newNode(9);
head->next->next = newNode(9);
head->next->next->next = newNode(9);
printf ( "List is " );
printList(head);
head = addOne(head);
printf ( "Resultant list is " );
printList(head);
return 0;
} |
Output:
List is 1999 Resultant list is 2000
Simple approach and easy implementation: The idea is to store the last non 9 digit pointer so that if the last pointer is zero we can replace all the nodes after stored node(which contains the location of last digit before 9) to 0 and add the value of the stored node by 1
// Recursive C++ program to add 1 to // a linked list #include <bits/stdc++.h> // Linked list node struct Node
{ 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;
} Node* addOne(Node* head) { // Your Code here
// return head of list after
// adding one
Node* ln = head;
if (head->next == NULL)
{
head->data += 1;
return head;
}
Node* t = head;
int prev;
while (t->next)
{
if (t->data != 9)
{
ln = t;
}
t = t->next;
}
if (t->data == 9 &&
ln != NULL)
{
if (ln->data == 9 &&
ln == head)
{
Node* temp = newNode(1);
temp->next = head;
head = temp;
t = ln;
}
else
{
t = ln;
t->data += 1;
t = t->next;
}
while (t)
{
t->data = 0;
t = t->next;
}
}
else
{
t->data += 1;
}
return head;
} // A utility function to print // a linked list void printList(Node* node)
{ while (node != NULL)
{
printf ( "%d->" ,
node->data);
node = node->next;
}
printf ( "NULL" );
printf ( "" );
} // Driver code int main( void )
{ Node* head = newNode(1);
head->next = newNode(9);
head->next->next = newNode(9);
head->next->next->next = newNode(9);
printf ( "List is " );
printList(head);
head = addOne(head);
printf ( "Resultant list is " );
printList(head);
return 0;
} // This code is contribute by maddler |
Output:
List is 1999 Resultant list is 2000
Time Complexity: O(n)
Auxiliary Space: O(1)
Please refer complete article on Add 1 to a number represented as linked list for more details!