Given a singly linked list containing n nodes. Modify the value of first half nodes such that 1st node’s new value is equal to the last node’s value minus first node’s current value, 2nd node’s new value is equal to the second last node’s value minus 2nd node’s current value, likewise for first half nodes. If n is odd then the value of the middle node remains unchanged.
Examples:
Input: 10 -> 4 -> 5 -> 3 -> 6
Output: -4 -> -1 -> 5 -> 3 -> 6
Input: 2 -> 9 -> 8 -> 12 -> 7 -> 10
Output: 8 -> -2 -> 4 -> 12 -> 7 -> 10
Approach: Traverse the link list using recursion for only second half of the list rather than recursing the whole list, thereby reducing the stack frame. Based on the number of nodes in the list, we calculate the starting point for the second half of the list and the list is recursed for the second half. Once the second half is recursed completely, the value of the node present in the stack and the value of the current node is subtracted.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* insert( int data)
{
Node* temp;
temp = new Node;
temp->data = data;
temp->next = NULL;
return temp;
}
int getTotalNodeCount(Node* head)
{
int totalNodesCount = 0;
while (head != NULL)
{
totalNodesCount++;
head = head->next;
}
return totalNodesCount;
}
void modifyContents(Node** first_half ,
Node* second_half)
{
if (second_half == NULL)
{
return ;
}
modifyContents(first_half,second_half->next);
(*first_half)->data = second_half->data - (*first_half)->data;
(*first_half) = (*first_half)->next;
return ;
}
void modifyContentsWrapper(Node** head)
{
Node *ptr = NULL;
Node *temp = NULL;
int diff = 0;
int length = 0;
if (*head == NULL)
{
return ;
}
length = getTotalNodeCount(*head);
diff = (length%2 == 0? (length/2) :(length/2)+1 );
ptr = *head;
while (diff--)
ptr = ptr->next;
temp = *head;
modifyContents(&temp,ptr);
return ;
}
void print(Node* nod)
{
if (nod == NULL) {
return ;
}
cout << nod->data;
if (nod->next != NULL)
cout << " -> " ;
print(nod->next);
}
int main()
{
Node* head = insert(2);
head->next = insert(9);
head->next->next = insert(8);
head->next->next->next = insert(12);
head->next->next->next->next = insert(7);
head->next->next->next->next->next = insert(10);
modifyContentsWrapper(&head);
print(head);
return 0;
}
|
Java
class GFG
{
static class Node
{
int data;
Node next;
};
static Node insert( int data)
{
Node temp;
temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
static int getTotalNodeCount(Node head)
{
int totalNodesCount = 0 ;
while (head != null )
{
totalNodesCount++;
head = head.next;
}
return totalNodesCount;
}
static Node temp = null ;
static void modifyContents(Node second_half)
{
if (second_half == null )
{
return ;
}
modifyContents(second_half.next);
(temp).data = second_half.data - (temp).data;
(temp) = (temp).next;
return ;
}
static Node modifyContentsWrapper(Node head)
{
Node ptr = null ;
temp = null ;
int diff = 0 ;
int length = 0 ;
if (head == null )
{
return null ;
}
length = getTotalNodeCount(head);
diff = (length % 2 == 0 ?
(length / 2 ) : (length / 2 ) + 1 );
ptr = head;
while (diff--> 0 )
ptr = ptr.next;
temp = head;
modifyContents(ptr);
return head;
}
static void print(Node nod)
{
if (nod == null )
{
return ;
}
System.out.print( nod.data);
if (nod.next != null )
System.out.print( " -> " );
print(nod.next);
}
public static void main(String args[])
{
Node head = insert( 2 );
head.next = insert( 9 );
head.next.next = insert( 8 );
head.next.next.next = insert( 12 );
head.next.next.next.next = insert( 7 );
head.next.next.next.next.next = insert( 10 );
head = modifyContentsWrapper(head);
print(head);
}
}
|
Python
class Node:
def __init__( self , data):
self .data = data
self . next = None
def insert( data) :
temp = Node( 0 )
temp.data = data
temp. next = None
return temp
def getTotalNodeCount( head) :
totalNodesCount = 0
while (head ! = None ):
totalNodesCount = totalNodesCount + 1
head = head. next
return totalNodesCount
temp = None
def modifyContents( second_half) :
if (second_half = = None ):
return
global temp
modifyContents(second_half. next )
(temp).data = second_half.data - (temp).data
(temp) = (temp). next
return
def modifyContentsWrapper(head) :
ptr = None
diff = 0
length = 0
global temp
temp = None
if (head = = None ) :
return None
length = getTotalNodeCount(head)
if (length % 2 = = 0 ):
diff = (length / 2 )
else :
diff = (length / 2 ) + 1
ptr = head
while (diff > 0 ):
diff = diff - 1
ptr = ptr. next
temp = head
modifyContents(ptr)
return head
def print_(nod):
if (nod = = None ) :
return
print (nod.data, end = " " )
if (nod. next ! = None ):
print ( " -> " ,end = "")
print_(nod. next )
head = insert( 2 )
head. next = insert( 9 )
head. next . next = insert( 8 )
head. next . next . next = insert( 12 )
head. next . next . next . next = insert( 7 )
head. next . next . next . next . next = insert( 10 )
head = modifyContentsWrapper(head)
print_(head)
|
C#
using System;
class GFG
{
public class Node
{
public int data;
public Node next;
};
static Node insert( int data)
{
Node temp;
temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
static int getTotalNodeCount(Node head)
{
int totalNodesCount = 0;
while (head != null )
{
totalNodesCount++;
head = head.next;
}
return totalNodesCount;
}
static Node temp = null ;
static void modifyContents(Node second_half)
{
if (second_half == null )
{
return ;
}
modifyContents(second_half.next);
(temp).data = second_half.data - (temp).data;
(temp) = (temp).next;
return ;
}
static Node modifyContentsWrapper(Node head)
{
Node ptr = null ;
temp = null ;
int diff = 0;
int length = 0;
if (head == null )
{
return null ;
}
length = getTotalNodeCount(head);
diff = (length % 2 == 0 ?
(length / 2) : (length / 2) + 1);
ptr = head;
while (diff-->0)
ptr = ptr.next;
temp = head;
modifyContents(ptr);
return head;
}
static void print(Node nod)
{
if (nod == null )
{
return ;
}
Console.Write(nod.data);
if (nod.next != null )
Console.Write( " -> " );
print(nod.next);
}
public static void Main(String []args)
{
Node head = insert(2);
head.next = insert(9);
head.next.next = insert(8);
head.next.next.next = insert(12);
head.next.next.next.next = insert(7);
head.next.next.next.next.next = insert(10);
head = modifyContentsWrapper(head);
print(head);
}
}
|
Javascript
<script>
class Node {
constructor() {
this .data = 0;
this .next = null ;
}
}
function insert(data) {
var temp;
temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
function getTotalNodeCount(head) {
var totalNodesCount = 0;
while (head != null ) {
totalNodesCount++;
head = head.next;
}
return totalNodesCount;
}
var temp = null ;
function modifyContents(second_half) {
if (second_half == null ) {
return ;
}
modifyContents(second_half.next);
temp.data = second_half.data - temp.data;
temp = temp.next;
return ;
}
function modifyContentsWrapper(head) {
var ptr = null ;
temp = null ;
var diff = 0;
var length = 0;
if (head == null ) {
return null ;
}
length = getTotalNodeCount(head);
diff =
length % 2 == 0 ?
parseInt(length / 2) : parseInt(length / 2) + 1;
ptr = head;
while (diff-- > 0) ptr = ptr.next;
temp = head;
modifyContents(ptr);
return head;
}
function print(nod) {
if (nod == null ) {
return ;
}
document.write(nod.data);
if (nod.next != null ) document.write( " -> " );
print(nod.next);
}
var head = insert(2);
head.next = insert(9);
head.next.next = insert(8);
head.next.next.next = insert(12);
head.next.next.next.next = insert(7);
head.next.next.next.next.next = insert(10);
head = modifyContentsWrapper(head);
print(head);
</script>
|
Output
8 -> -2 -> 4 -> 12 -> 7 -> 10
Complexity Analysis:
- Time Complexity: O(N), as we are using recursive calls to traverse N times, where N is the number of Nodes in the linked list.
- Auxiliary Space: O(1), as we are not using any extra space.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
14 Sep, 2022
Like Article
Save Article