• Difficulty Level : Medium
• Last Updated : 22 Oct, 2021

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.
(No extra memory to be used).

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

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

Approach: The following steps are:

1. Split the list from the middle. Perform front and back split. If the number of elements is odd, the extra element should go in the 1st(front) list.
2. Reverse the 2nd(back) list.
3. Perform the required subtraction while traversing both list simultaneously.
4. Again reverse the 2nd list.
5. Concatenate the 2nd list back to the end of the 1st list.

C++

// C++ implementation to modify the contents of
#include <bits/stdc++.h>
using namespace std;

struct Node
{
int data;
struct Node* next;
};

/* function prototype for printing the list */
void printList(struct Node*);

/* Function to insert a node at the beginning of
void push(struct Node **head_ref, int new_data)
{
/* allocate node */
struct Node* new_node =
(struct Node*) malloc(sizeof(struct Node));

/* put in the data  */
new_node->data = new_data;

/* link the old list at the end of the new node */

/* move the head to point to the new node */
}

/* Split the nodes of the given list
into front and back halves,
and return the two lists
using the reference parameters.
Uses the fast/slow pointer strategy. */
struct Node **front_ref, struct Node **back_ref)
{
Node *slow, *fast;

/* Advance 'fast' two nodes, and
while (fast != NULL)
{
fast = fast->next;
if (fast != NULL)
{
slow = slow->next;
fast = fast->next;
}
}

/* 'slow' is before the midpoint in the list,
so split it in two at that point. */
*back_ref = slow->next;
slow->next = NULL;
}

/* Function to reverse the linked list */
{
struct Node *current, *prev, *next;
prev = NULL;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
}

// perform the required subtraction operation on
// the 1st half of the linked list
void modifyTheContentsOf1stHalf(struct Node *front,
struct Node *back)
{
// traversing both the lists simultaneously
while (back != NULL)
{
// subtraction operation and node data
// modification
front->data = front->data - back->data;

front = front->next;
back = back->next;
}
}

// function to concatenate the 2nd(back) list at the end of
// the 1st(front) list and returns the head of the new list
struct Node* concatFrontAndBackList(struct Node *front,
struct Node *back)
{

while (front->next != NULL)
front = front->next;

front->next    = back;

}

// function to modify the contents of the linked list
{
// if list is empty or contains only single node

struct Node *front, *back;

// split the list into two halves
// front and back lists

// reverse the 2nd(back) list
reverseList(&back);

// modify the contents of 1st half
modifyTheContentsOf1stHalf(front, back);

// agains reverse the 2nd(back) list
reverseList(&back);

// concatenating the 2nd list back to the
// end of the 1st list

// pointer to the modified list
}

// function to print the linked list
{
return;

{
cout << head->data << " -> ";
}
}

// Driver program to test above
int main()
{

// print the modified linked list
cout << "Modified List:" << endl;
return 0;
}

Java

// Java implementation to modify the contents
class GFG
{

static class Node
{
int data;
Node next;
};

/* Function to insert a node at the beginning
static Node push(Node head_ref, int new_data)
{
/* allocate node */
Node new_node =new Node();
/* put in the data */
new_node.data = new_data;

/* link the old list at the end
of the new node */

/* move the head to point to the new node */

}

static Node front,back;

/* Split the nodes of the given list
into front and back halves,
and return the two lists
using the reference parameters.
Uses the fast/slow pointer strategy. */
{
Node slow, fast;

/* Advance 'fast' two nodes, and
while (fast != null)
{
fast = fast.next;
if (fast != null)
{
slow = slow.next;
fast = fast.next;
}
}

/* 'slow' is before the midpoint in the list,
so split it in two at that point. */
back = slow.next;
slow.next = null;
}

/* Function to reverse the linked list */
{
Node current, prev, next;
prev = null;
while (current != null)
{
next = current.next;
current.next = prev;
prev = current;
current = next;
}
}

// perform the required subtraction operation
// on the 1st half of the linked list
static void modifyTheContentsOf1stHalf()
{
Node front1 = front, back1 = back;
// traversing both the lists simultaneously
while (back1 != null)
{
// subtraction operation and node data
// modification
front1.data = front1.data - back1.data;

front1 = front1.next;
back1 = back1.next;
}
}

// function to concatenate the 2nd(back) list
// at the end of the 1st(front) list and
// returns the head of the new list
static Node concatFrontAndBackList(Node front,
Node back)
{

if(front == null)return back;

while (front.next != null)
front = front.next;

front.next = back;

}

// function to modify the contents of the linked list
{
// if list is empty or contains only single node
front = null; back = null;

// split the list into two halves
// front and back lists

// reverse the 2nd(back) list
back = reverseList(back);

// modify the contents of 1st half
modifyTheContentsOf1stHalf();

// agains reverse the 2nd(back) list
back = reverseList(back);

// concatenating the 2nd list back to the
// end of the 1st list

// pointer to the modified list
}

// function to print the linked list
{
return;

{
}
}

// Driver Code
public static void main(String args[])
{

// print the modified linked list
System.out.println( "Modified List:" );
}
}

// This code is contributed by Arnab Kundu

Python3

# Python3 implementation to modify the contents

class Node:

def __init__(self, data):
self.data = data
self.next = None

# Function to insert a node at the beginning

# allocate node
new_node =Node(0)

# put in the data
new_node.data = new_data

# link the old list at the end
#of the new node

# move the head to point to the new node

front = None
back = None

# Split the nodes of the given list
# into front and back halves,
# and return the two lists
# using the reference parameters.
# Uses the fast/slow pointer strategy.

global front
global back
slow = None
fast = None

# Advance 'fast' two nodes, and
while (fast != None):

fast = fast.next
if (fast != None):
slow = slow.next
fast = fast.next

# 'slow' is before the midpoint in the list,
# so split it in two at that point.
back = slow.next
slow.next = None

# Function to reverse the linked list

current = None
prev = None
next = None
prev = None
while (current != None):

next = current.next
current.next = prev
prev = current
current = next

# perform the required subtraction operation
# on the 1st half of the linked list
def modifyTheContentsOf1stHalf():

global front
global back
front1 = front
back1 = back

# traversing both the lists simultaneously
while (back1 != None):

# subtraction operation and node data
# modification
front1.data = front1.data - back1.data

front1 = front1.next
back1 = back1.next

# function to concatenate the 2nd(back) list
# at the end of the 1st(front) list and
# returns the head of the new list
def concatFrontAndBackList( front, back):

if(front == None):
return back

while (front.next != None):
front = front.next

front.next = back

# function to modify the contents of the linked list

global front
global back

# if list is empty or contains only single node
front = None
back = None

# split the list into two halves
# front and back lists

# reverse the 2nd(back) list
back = reverseList(back)

# modify the contents of 1st half
modifyTheContentsOf1stHalf()

# agains reverse the 2nd(back) list
back = reverseList(back)

# concatenating the 2nd list back to the
# end of the 1st list

# pointer to the modified list

# function to print the linked list

return

# Driver Code

# print the modified linked list
print( "Modified List:" )

# This code is contributed by Arnab Kundu

C#

// C# implementation to modify the
// contents of the linked list
using System;

class GFG
{

public class Node
{
public int data;
public Node next;
};

/* Function to insert a node at
the beginning of the linked list */
int new_data)
{
/* allocate node */
Node new_node = new Node();

/* put in the data */
new_node.data = new_data;

/* link the old list at the end
of the new node */

/* move the head to point to the new node */

}

static Node front, back;

/* Split the nodes of the given list
into front and back halves,
and return the two lists
using the reference parameters.
Uses the fast/slow pointer strategy. */
{
Node slow, fast;

/* Advance 'fast' two nodes, and
while (fast != null)
{
fast = fast.next;
if (fast != null)
{
slow = slow.next;
fast = fast.next;
}
}

/* 'slow' is before the midpoint in the list,
so split it in two at that point. */
back = slow.next;
slow.next = null;
}

/* Function to reverse the linked list */
{
Node current, prev, next;
prev = null;
while (current != null)
{
next = current.next;
current.next = prev;
prev = current;
current = next;
}
}

// perform the required subtraction operation
// on the 1st half of the linked list
static void modifyTheContentsOf1stHalf()
{
Node front1 = front, back1 = back;

// traversing both the lists simultaneously
while (back1 != null)
{
// subtraction operation and node data
// modification
front1.data = front1.data - back1.data;

front1 = front1.next;
back1 = back1.next;
}
}

// function to concatenate the 2nd(back) list
// at the end of the 1st(front) list and
// returns the head of the new list
static Node concatFrontAndBackList(Node front,
Node back)
{

if(front == null)
return back;

while (front.next != null)
front = front.next;

front.next = back;

}

// function to modify the contents of
{
// if list is empty or contains
// only single node
front = null; back = null;

// split the list into two halves
// front and back lists

// reverse the 2nd(back) list
back = reverseList(back);

// modify the contents of 1st half
modifyTheContentsOf1stHalf();

// agains reverse the 2nd(back) list
back = reverseList(back);

// concatenating the 2nd list back to the
// end of the 1st list

// pointer to the modified list
}

// function to print the linked list
{
return;

{
}
}

// Driver Code
public static void Main()
{

// print the modified linked list
Console.WriteLine( "Modified List:" );
}
}

// This code is contributed by PrinciRaj1992

Javascript

<script>

// JavaScript implementation to modify the
// contents of the linked list
class Node {
constructor() {
this.data = 0;
this.next = null;
}
}

/* Function to insert a node at
the beginning of the linked list */
/* allocate node */
var new_node = new Node();

/* put in the data */
new_node.data = new_data;

/* link the old list at the end
of the new node */

/* move the head to point to the new node */

}

var front, back;

/* Split the nodes of the given list
into front and back halves,
and return the two lists
using the reference parameters.
Uses the fast/slow pointer strategy. */
var slow, fast;

/* Advance 'fast' two nodes, and
while (fast != null) {
fast = fast.next;
if (fast != null) {
slow = slow.next;
fast = fast.next;
}
}

/* 'slow' is before the midpoint in the list,
so split it in two at that point. */
back = slow.next;
slow.next = null;
}

/* Function to reverse the linked list */
var current, prev, next;
prev = null;
while (current != null) {
next = current.next;
current.next = prev;
prev = current;
current = next;
}
}

// perform the required subtraction operation
// on the 1st half of the linked list
function modifyTheContentsOf1stHalf() {
var front1 = front,
back1 = back;

// traversing both the lists simultaneously
while (back1 != null) {
// subtraction operation and node data
// modification
front1.data = front1.data - back1.data;

front1 = front1.next;
back1 = back1.next;
}
}

// function to concatenate the 2nd(back) list
// at the end of the 1st(front) list and
// returns the head of the new list
function concatFrontAndBackList(front, back) {

if (front == null) return back;

while (front.next != null) front = front.next;

front.next = back;

}

// function to modify the contents of
// if list is empty or contains
// only single node
front = null;
back = null;

// split the list into two halves
// front and back lists

// reverse the 2nd(back) list
back = reverseList(back);

// modify the contents of 1st half
modifyTheContentsOf1stHalf();

// agains reverse the 2nd(back) list
back = reverseList(back);

// concatenating the 2nd list back to the
// end of the 1st list

// pointer to the modified list
}

// function to print the linked list

}
}

// Driver Code

// print the modified linked list
document.write("Modified List: <br>");

</script>

Output:

Modified List:
-8 -> 2 -> -4 -> 12 -> 7 -> 10

Time Complexity: O(n), where n in the number of nodes.

Another approach (Using Stack) :
1. Find the starting point of second half Linked List.
2. Push all elements of second half list into stack s.
3. Traverse list starting from head using temp until stack is not empty and do Modify temp->data by subtracting the top element of stack for every node.

Below is the implementation using stack.

C++

// C++ implementation to modify the
// contents of the linked list
#include <bits/stdc++.h>
using namespace std;

struct Node
{
int data;
struct Node* next;
};

// function prototype for printing the list
void printList(struct Node*);

// Function to insert a node at the
// beginning of the linked list
void push(struct Node **head_ref, int new_data)
{

// allocate node
struct Node* new_node =
(struct Node*) malloc(sizeof(struct Node));

// put in the data
new_node->data = new_data;

// link the old list at the end of the new node

// move the head to point to the new node
}

// function to print the linked list
{
return;

{
cout << head->data << " -> ";
}
}

// Function to middle node of list.
{

while(fast && fast->next)
{

// Advance 'fast' two nodes, and
slow = slow->next ;
fast = fast->next->next ;
}

// If number of nodes are odd then update slow
// by slow->next;
if(fast)
slow = slow->next ;

return slow ;
}

// function to modify the contents of the linked list.
void modifyTheList(struct Node *head, struct Node *slow)
{
// Create Stack.
stack <int> s;

while(slow)
{
s.push( slow->data ) ;
slow = slow->next ;
}

// Traverse the list by using temp until stack is empty.
while( !s.empty() )
{
temp->data = temp->data - s.top() ;
temp = temp->next ;
s.pop() ;
}

}

// Driver program to test above
int main()
{
struct Node *head = NULL, *mid ;

// Call Function to Find the starting point of second half of list.

// Call function to modify the contents of the linked list.

// print the modified linked list
cout << "Modified List:" << endl;
return 0;
}

// This is contributed by Mr. Gera

Java

// Java implementation to modify the
// contents of the linked list
import java.util.*;

class GFG
{

static class Node
{

int data;
Node next;
};

// Function to insert a node at the
// beginning of the linked list
static Node push(Node head_ref, int new_data)
{

// allocate node
Node new_node = new Node();

// put in the data
new_node.data = new_data;

// link the old list at the end of the new node

// move the head to point to the new node
}

// function to print the linked list
{
{
return;
}

{
}
}

// Function to middle node of list.
{

while (fast != null && fast.next != null)
{

// Advance 'fast' two nodes, and
slow = slow.next;
fast = fast.next.next;
}

// If number of nodes are odd then update slow
// by slow.next;
if (fast != null)
{
slow = slow.next;
}

return slow;
}

// function to modify the contents of the linked list.
static void modifyTheList(Node head, Node slow)
{
// Create Stack.
Stack<Integer> s = new Stack<Integer>();

while (slow != null)
{
slow = slow.next;
}

// Traverse the list by using temp until stack is empty.
while (!s.empty())
{
temp.data = temp.data - s.peek();
temp = temp.next;
s.pop();
}

}

// Driver program to test above
public static void main(String[] args)
{

// Call Function to Find the starting
// point of second half of list.

// Call function to modify
// the contents of the linked list.

// print the modified linked list
System.out.print("Modified List:" + "\n");
}
}

// This code is contributed by Rajput-Ji

Python3

# Python3 implementation to modify the
# contents of the linked list

class Node:

def __init__(self):

self.data = 0
self.next = None

# Function to insert a node at the
# beginning of the linked list

# Allocate node
new_node = Node()

# Put in the data
new_node.data = new_data

# Link the old list at the end
# of the new node

# Move the head to point to the new node

# Function to print the linked list

return;

print(head.data, end = ' -> ')

# Function to middle node of list.

while (fast and fast.next):

# Advance 'fast' two nodes, and
slow = slow.next
fast = fast.next.next

# If number of nodes are odd then
# update slow by slow.next;
if (fast):
slow = slow.next

return slow

# Function to modify the contents of

# Create Stack.
s = []

while (slow):
s.append(slow.data)
slow = slow.next

# Traverse the list by using
# temp until stack is empty.
while (len(s) != 0):
temp.data = temp.data - s[-1]
temp = temp.next
s.pop()

# Driver code
if __name__=='__main__':

# Call Function to Find the
# starting point of second half of list.

# Call function to modify the
# contents of the linked list.

# Print the modified linked list
print("Modified List:")

# This code is contributed by rutvik_56

C#

// C# implementation to modify the
// contents of the linked list
using System;
using System.Collections.Generic;

class GFG
{

public class Node
{

public int data;
public Node next;
};

// Function to insert a node at the
// beginning of the linked list
static Node push(Node head_ref, int new_data)
{

// allocate node
Node new_node = new Node();

// put in the data
new_node.data = new_data;

// link the old list at the end of the new node

// move the head to point to the new node
}

// function to print the linked list
{
{
return;
}

{
}
}

// Function to middle node of list.
{

while (fast != null && fast.next != null)
{

// Advance 'fast' two nodes, and
slow = slow.next;
fast = fast.next.next;
}

// If number of nodes are odd then update slow
// by slow.next;
if (fast != null)
{
slow = slow.next;
}

return slow;
}

// function to modify the contents of the linked list.
static void modifyTheList(Node head, Node slow)
{
// Create Stack.
Stack<int> s = new Stack<int>();

while (slow != null)
{
s.Push(slow.data);
slow = slow.next;
}

// Traverse the list by using temp until stack is empty.
while (s.Count != 0)
{
temp.data = temp.data - s.Peek();
temp = temp.next;
s.Pop();
}

}

// Driver code
public static void Main(String[] args)
{

// Call Function to Find the starting
// point of second half of list.

// Call function to modify
// the contents of the linked list.

// print the modified linked list
Console.Write("Modified List:" + "\n");
}
}

// This code is contributed by PrinciRaj1992

Javascript

<script>

// JavaScript implementation to modify the
// contents of the linked list

class Node {
constructor(val) {
this.data = val;
this.next = null;
}
}

// Function to insert a node at the
// beginning of the linked list

// allocate node
var new_node = new Node();

// put in the data
new_node.data = new_data;

// link the old list at the end of the new node

// move the head to point to the new node
}

// function to print the linked list
return;
}

}
}

// Function to middle node of list.

while (fast != null && fast.next != null) {

// Advance 'fast' two nodes, and
slow = slow.next;
fast = fast.next.next;
}

// If number of nodes are odd then update slow
// by slow.next;
if (fast != null) {
slow = slow.next;
}

return slow;
}

// function to modify the contents of the linked list.
// Create Stack.
var s = [];

while (slow != null) {
s.push(slow.data);
slow = slow.next;
}

// Traverse the list by using temp until stack is empty.
while (s.length!=0) {
temp.data = temp.data - s.pop();
temp = temp.next;

}

}

// Driver program to test above

// Call Function to Find the starting
// point of second half of list.

// Call function to modify
// the contents of the linked list.

// print the modified linked list
document.write("Modified List:" + "<br/>");

// This code contributed by Rajput-Ji

</script>

Output:

Modified List:
-8 -> 2 -> -4 -> 12 -> 7 -> 10

Time Complexity : O(n)
Space Complexity : O(n/2)
References: https://www.careercup.com/question?id=5657550909341696

My Personal Notes arrow_drop_up