XOR linked list: Reverse last K nodes of a Linked List
Last Updated :
26 Mar, 2024
Given a XOR Linked List and a positive integer K, the task is to reverse the last K nodes in the given XOR linked list.
Examples:
Input: LL: 7 <–> 6 <–> 8 <–> 11 <–> 3 <–> 1, K = 3
Output: 7<–>6<–>8<–>1<–>3<–>11
Input: LL: 7 <–> 6 <–> 8 <–> 11 <–> 3 <–> 1 <–> 2 <–> 0, K = 5
Output: 7<–>6<–>8<–>0<–>2<–>1<–>3<–>11
Approach: Follow the steps below to solve the given problem:
Below is the implementation of the above approach:
C++
// C++ program for the above approach
#include<bits/stdc++.h>
using namespace std;
// Structure of a node of XOR Linked List
struct Node {
// Stores data value of a node
int data;
// Stores XOR of previous pointer and next pointer
struct Node* nxp;
};
// Function to calculate Bitwise XOR of the two nodes
struct Node* XOR(struct Node* a, struct Node* b) {
return (struct Node*)((uintptr_t)(a) ^ (uintptr_t)(b));
}
// Function to insert a node with given value at given position
struct Node* insert(struct Node** head, int value) {
// If XOR linked list is empty
if (*head == NULL) {
// Initialize a new Node
struct Node* node = new Node;
// Stores data value in the node
node->data = value;
// Stores XOR of previous and next pointer
node->nxp = XOR(NULL, NULL);
// Update pointer of head node
*head = node;
}
// If the XOR linked list is not empty
else {
// Stores the address of the current node
struct Node* curr = *head;
// Stores the address of the previous node
struct Node* prev = NULL;
// Initialize a new Node
struct Node* node = new Node;
// Update address of current node
curr->nxp = XOR(node, XOR(NULL, curr->nxp));
// Update address of the new node
node->nxp = XOR(NULL, curr);
// Update the head node
*head = node;
// Update the data value of current node
node->data = value;
}
return *head;
}
// Function to print elements of the XOR Linked List
void printList(struct Node** head)
{
// Stores XOR pointer in the current node
struct Node* curr = *head;
// Stores XOR pointer in the previous Node
struct Node* prev = NULL;
// Stores XOR pointer in the next node
struct Node* next;
// Traverse XOR linked list
while (curr != NULL) {
// Print the current node
std::cout << curr->data << " ";
// Forward traversal
next = XOR(prev, curr->nxp);
// Update the prev pointer
prev = curr;
// Update the curr pointer
curr = next;
}
}
// Function to reverse the linked list in the groups of K
struct Node* reverseK(struct Node** head, int K, int len) {
struct Node* curr = *head;
// If head is NULL
if (curr == NULL)
return NULL;
// If the size of XOR linked list is less than K
else if (len < K)
return *head;
else {
int count = 0;
// Stores the XOR pointer in the previous Node
struct Node* prev = NULL;
// Stores the XOR pointer in the next node
struct Node* next;
while (count < K) {
// Forward traversal
next = XOR(prev, curr->nxp);
// Update the prev pointer
prev = curr;
// Update the curr pointer
curr = next;
// Count the number of nodes processed
count++;
}
// Remove the prev node from the next node
prev->nxp = XOR(NULL, XOR(prev->nxp, curr));
// Add the head pointer with prev
(*head)->nxp = XOR(XOR(NULL, (*head)->nxp), curr);
// Add the prev with the head
if (curr != NULL)
curr->nxp = XOR(XOR(curr->nxp, prev), *head);
return prev;
}
}
// Function to reverse last K nodes of the given XOR Linked List
void reverseLL(struct Node* head, int N, int K) {
// Reverse the given XOR LL
head = reverseK(&head, N, N);
// Reverse the first K nodes of
// the XOR LL
head = reverseK(&head, K, N);
// Reverse the given XOR LL
head = reverseK(&head, N, N);
// Print the final linked list
printList(&head);
}
// Driver Code
int main()
{
// Stores number of nodes
int N = 6;
// Given XOR Linked List
struct Node* head = NULL;
insert(&head, 1);
insert(&head, 3);
insert(&head, 11);
insert(&head, 8);
insert(&head, 6);
insert(&head, 7);
int K = 3;
reverseLL(head, N, K);
return (0);
}
// This code is contributed by ajaymakvana.
C
// C program for the above approach
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
// Structure of a node
// of XOR Linked List
struct Node {
// Stores data value
// of a node
int data;
// Stores XOR of previous
// pointer and next pointer
struct Node* nxp;
};
// Function to calculate
// Bitwise XOR of the two nodes
struct Node* XOR(struct Node* a,
struct Node* b)
{
return (struct Node*)((uintptr_t)(a)
^ (uintptr_t)(b));
}
// Function to insert a node with
// given value at given position
struct Node* insert(struct Node** head,
int value)
{
// If XOR linked list is empty
if (*head == NULL) {
// Initialize a new Node
struct Node* node
= (struct Node*)malloc(
sizeof(struct Node));
// Stores data value in the node
node->data = value;
// Stores XOR of previous
// and next pointer
node->nxp = XOR(NULL, NULL);
// Update pointer of head node
*head = node;
}
// If the XOR linked
// list is not empty
else {
// Stores the address
// of the current node
struct Node* curr = *head;
// Stores the address
// of the previous node
struct Node* prev = NULL;
// Initialize a new Node
struct Node* node
= (struct Node*)malloc(
sizeof(struct Node));
// Update address of current node
curr->nxp = XOR(node,
XOR(
NULL, curr->nxp));
// Update address of the new node
node->nxp = XOR(NULL, curr);
// Update the head node
*head = node;
// Update the data
// value of current node
node->data = value;
}
return *head;
}
// Function to print elements
// of the XOR Linked List
void printList(struct Node** head)
{
// Stores XOR pointer
// in the current node
struct Node* curr = *head;
// Stores XOR pointer
// in the previous Node
struct Node* prev = NULL;
// Stores XOR pointer in the
// next node
struct Node* next;
// Traverse XOR linked list
while (curr != NULL) {
// Print the current node
printf("%d ", curr->data);
// Forward traversal
next = XOR(prev, curr->nxp);
// Update the prev pointer
prev = curr;
// Update the curr pointer
curr = next;
}
}
// Function to reverse the linked
// list in the groups of K
struct Node* reverseK(struct Node** head,
int K, int len)
{
struct Node* curr = *head;
// If head is NULL
if (curr == NULL)
return NULL;
// If the size of XOR linked
// list is less than K
else if (len < K)
return *head;
else {
int count = 0;
// Stores the XOR pointer
// in the previous Node
struct Node* prev = NULL;
// Stores the XOR pointer
// in the next node
struct Node* next;
while (count < K) {
// Forward traversal
next = XOR(prev, curr->nxp);
// Update the prev pointer
prev = curr;
// Update the curr pointer
curr = next;
// Count the number of
// nodes processed
count++;
}
// Remove the prev node
// from the next node
prev->nxp = XOR(NULL,
XOR(prev->nxp,
curr));
// Add the head pointer with prev
(*head)->nxp = XOR(XOR(NULL,
(*head)->nxp),
curr);
// Add the prev with the head
if (curr != NULL)
curr->nxp = XOR(XOR(curr->nxp,
prev),
*head);
return prev;
}
}
// Function to reverse last K nodes
// of the given XOR Linked List
void reverseLL(struct Node* head,
int N, int K)
{
// Reverse the given XOR LL
head = reverseK(&head, N, N);
// Reverse the first K nodes of
// the XOR LL
head = reverseK(&head, K, N);
// Reverse the given XOR LL
head = reverseK(&head, N, N);
// Print the final linked list
printList(&head);
}
// Driver Code
int main()
{
// Stores number of nodes
int N = 6;
// Given XOR Linked List
struct Node* head = NULL;
insert(&head, 1);
insert(&head, 3);
insert(&head, 11);
insert(&head, 8);
insert(&head, 6);
insert(&head, 7);
int K = 3;
reverseLL(head, N, K);
return (0);
}
Java
// Java program for the above approach
import java.util.*;
// Structure of a node of XOR Linked List
class Node {
// Stores data value of a node
int data;
// Stores XOR of previous pointer and next pointer
Node npx;
// Constructor
Node(int data)
{
this.data = data;
this.npx = null;
}
}
// Class for the XOR Linked List
class XorLinkedList {
Node head;
XorLinkedList() { head = null; }
// Function to insert a node with given value at given
// position
void insert(int value)
{
Node node = new Node(value);
node.npx = head;
head = node;
}
// Function to print elements of the XOR Linked List
void printList()
{
// Stores XOR pointer in the current node
Node curr = head;
// Traverse XOR linked list
while (curr != null) {
// Print the current node
System.out.print(curr.data + " ");
// Update the curr pointer
curr = curr.npx;
}
}
// Function to reverse the linked list in the groups of
// K
Node reverseK(Node head, int K, int len)
{
Node curr = head;
// If head is NULL
if (curr == null)
return null;
// If the size of XOR linked list is less than K
else if (len < K)
return head;
else {
int count = 0;
// Stores the XOR pointer in the previous Node
Node prev = null;
// Stores the XOR pointer in the next node
Node next = null;
while (count < K && curr != null) {
// Forward traversal
next = curr.npx;
// Update the curr.npx pointer
curr.npx = prev;
// Update the prev pointer
prev = curr;
// Update the curr pointer
curr = next;
// Count the number of nodes processed
count++;
}
// // Add the prev with the head
if (curr != null)
head.npx = curr;
// return prev
return prev;
}
}
// Function to reverse last K nodes of the given XOR
// Linked List
Node reverseLL(Node head, int N, int K)
{
// Reverse the given XOR LL
head = reverseK(head, N, N);
// Reverse the first K nodes of the XOR LL
head = reverseK(head, K, N);
// Reverse the given XOR LL
head = reverseK(head, N, N);
return head;
}
}
public class GFG {
// Driver Code
public static void main(String[] args)
{
// Stores number of nodes
int N = 6;
// Given XOR Linked List
XorLinkedList xorLinkedList = new XorLinkedList();
xorLinkedList.insert(1);
xorLinkedList.insert(3);
xorLinkedList.insert(11);
xorLinkedList.insert(8);
xorLinkedList.insert(6);
xorLinkedList.insert(7);
int K = 3;
xorLinkedList.head = xorLinkedList.reverseLL(
xorLinkedList.head, N, K);
// Print the final linked list
xorLinkedList.printList();
}
}
// This code is contributed by Susobhan Akhuli
JavaScript
// JavaScript program for the above approach
// Structure of a node of XOR Linked List
class Node {
constructor(data) {
this.data = data;
this.npx = null;
}
}
// Class for the XOR Linked List
class XorLinkedList {
constructor() {
this.head = null;
}
// Function to insert a node with given value at given
// position
insert(value) {
let node = new Node(value);
node.npx = this.head;
this.head = node;
}
// Function to print elements of the XOR Linked List
printList() {
// Stores XOR pointer in the current node
let curr = this.head;
let result = '';
// Traverse XOR linked list
while (curr != null) {
// Add the current node data to the result string
result += curr.data + " ";
// Update the curr pointer
curr = curr.npx;
}
// Print the result string
console.log(result.trim());
}
// Function to reverse the linked list in the groups of
// K
reverseK(head, K, len) {
let curr = head;
// If head is NULL
if (curr == null) return null;
// If the size of XOR linked list is less than K
else if (len < K) return head;
else {
let count = 0;
// Stores the XOR pointer in the previous Node
let prev = null;
// Stores the XOR pointer in the next node
let next = null;
while (count < K && curr != null) {
// Forward traversal
next = curr.npx;
// Update the curr.npx pointer
curr.npx = prev;
// Update the prev pointer
prev = curr;
// Update the curr pointer
curr = next;
// Count the number of nodes processed
count++;
}
// Add the prev with the head
if (curr != null) head.npx = curr;
// return prev
return prev;
}
}
// Function to reverse last K nodes of the given XOR
// Linked List
reverseLL(head, N, K) {
// Reverse the given XOR LL
head = this.reverseK(head, N, N);
// Reverse the first K nodes of the XOR LL
head = this.reverseK(head, K, N);
// Reverse the given XOR LL
head = this.reverseK(head, N, N);
return head;
}
}
// Driver Code
let N = 6;
// Given XOR Linked List
let xorLinkedList = new XorLinkedList();
xorLinkedList.insert(1);
xorLinkedList.insert(3);
xorLinkedList.insert(11);
xorLinkedList.insert(8);
xorLinkedList.insert(6);
xorLinkedList.insert(7);
let K = 3;
xorLinkedList.head = xorLinkedList.reverseLL(
xorLinkedList.head,
N,
K
);
// Print the final linked list
xorLinkedList.printList();
Python3
# Python program for the above approach
# Structure of a node of XOR Linked List
class Node:
# Constructor
def __init__(self, data):
# Stores data value of a node
self.data = data
# Stores XOR of previous pointer and next pointer
self.npx = None
# Class for the XOR Linked List
class XorLinkedList:
# Constructor
def __init__(self):
self.head = None
# Function to insert a node with given value at given position
def insert(self, value):
node = Node(value)
node.npx = self.head
self.head = node
# Function to print elements of the XOR Linked List
def printList(self):
# Stores XOR pointer in the current node
curr = self.head
# Traverse XOR linked list
while curr != None:
# Print the current node
print(curr.data, end=" ")
# Update the curr pointer
curr = curr.npx
# Function to reverse the linked list in the groups of K
def reverseK(self, head, K, length):
curr = head
# If head is NULL
if curr == None:
return None
# If the size of XOR linked list is less than K
elif length < K:
return head
else:
count = 0
# Stores the XOR pointer in the previous Node
prev = None
# Stores the XOR pointer in the next node
next = None
while count < K and curr != None:
# Forward traversal
next = curr.npx
# Update the curr.npx pointer
curr.npx = prev
# Update the prev pointer
prev = curr
# Update the curr pointer
curr = next
# Count the number of nodes processed
count += 1
# Add the prev with the head
if curr != None:
head.npx = curr
# return prev
return prev
# Function to reverse last K nodes of the given XOR Linked List
def reverseLL(self, head, N, K):
# Reverse the given XOR LL
head = self.reverseK(head, N, N)
# Reverse the first K nodes of the XOR LL
head = self.reverseK(head, K, N)
# Reverse the given XOR LL
head = self.reverseK(head, N, N)
return head
# Driver Code
if __name__ == "__main__":
# Stores number of nodes
N = 6
# Given XOR Linked List
xorLinkedList = XorLinkedList()
xorLinkedList.insert(1)
xorLinkedList.insert(3)
xorLinkedList.insert(11)
xorLinkedList.insert(8)
xorLinkedList.insert(6)
xorLinkedList.insert(7)
K = 3
xorLinkedList.head = xorLinkedList.reverseLL(xorLinkedList.head, N, K)
# Print the final linked list
xorLinkedList.printList()
# This code is contributed by Susobhan Akhuli
Time Complexity: O(N), as we are using a loop to traverse N times, where N is the length of the linked list.
Auxiliary Space: O(1), as we are not using any extra space.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...