Recursive approach for alternating split of Linked List

Given a linked list, split the linked list into two with alternate nodes.
Examples:
Input : 1 2 3 4 5 6 7
Output : 1 3 5 7
2 4 6
Input : 1 4 5 6
Output : 1 5
4 6
We have discussed Iterative splitting of linked list.
The idea is to begin from two nodes first and second. Let us call these nodes as ‘a’ and ‘b’. We recurs
Implementation:
C++
// CPP code to split linked list#include <bits/stdc++.h>using namespace std;// Node structurestruct Node { int data; struct Node* next;};// Function to push nodes// into linked listvoid push(Node** head, int new_data){ Node* new_node = new Node; new_node->data = new_data; new_node->next = (*head); (*head) = new_node;}// We basically remove link between 'a'// and its next. Similarly we remove link// between 'b' and its next. Then we recur// for remaining lists.void moveNode(Node* a, Node* b){ if (b == NULL || a == NULL) return; if (a->next != NULL) a->next = a->next->next; if (b->next != NULL) b->next = b->next->next; moveNode(a->next, b->next);}// function to split linked listvoid alternateSplitLinkedList(Node* head, Node** aRef, Node** bRef){ Node* curr = head; *aRef = curr; *bRef = curr->next; moveNode(*aRef, *bRef);}void display(Node* head){ Node* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; }}// Driver codeint main(){ Node* head = NULL; Node *a = NULL, *b = NULL; push(&head, 7); push(&head, 6); push(&head, 5); push(&head, 4); push(&head, 3); push(&head, 2); push(&head, 1); alternateSplitLinkedList(head, &a, &b); printf("a : "); display(a); printf("\nb : "); display(b); return 0;} |
Java
// Java code to split linked listclass GFG{ // Node structurestatic class Node { int data; Node next;};// Function to push nodes// into linked liststatic Node push(Node head, int new_data){ Node new_node = new Node(); new_node.data = new_data; new_node.next = (head); (head) = new_node; return head;}static Node a = null, b = null;// We basically remove link between 'a'// and its next. Similarly we remove link// between 'b' and its next. Then we recur// for remaining lists.static void moveNode(Node a, Node b){ if (b == null || a == null) return; if (a.next != null) a.next = a.next.next; if (b.next != null) b.next = b.next.next; moveNode(a.next, b.next);}// function to split linked liststatic void alternateSplitLinkedList(Node head){ Node curr = head; a = curr; b = curr.next; Node aRef = a, bRef = b; moveNode(aRef, bRef);}static void display(Node head){ Node curr = head; while (curr != null) { System.out.printf("%d ", curr.data); curr = curr.next; }}// Driver codepublic static void main(String args[]){ Node head = null; head = push(head, 7); head = push(head, 6); head = push(head, 5); head = push(head, 4); head = push(head, 3); head = push(head, 2); head = push(head, 1); alternateSplitLinkedList(head); System.out.printf("a : "); display(a); System.out.printf("\nb : "); display(b);}}// This code is contributed by Arnab Kundu |
Python
# Python code to split linked list # Node structure class Node(object): def __init__(self, d): self.data = d self.next = None# Function to push nodes # into linked list def push( head, new_data) : new_node = Node(0) new_node.data = new_data new_node.next = (head) (head) = new_node return head a = Noneb = None# We basically remove link between 'a' # and its next. Similarly we remove link # between 'b' and its next. Then we recur # for remaining lists. def moveNode( a, b) : if (b == None or a == None) : return if (a.next != None) : a.next = a.next.next if (b.next != None) : b.next = b.next.next moveNode(a.next, b.next) # function to split linked list def alternateSplitLinkedList(head) : curr = head global a global b a = curr b = curr.next aRef = a bRef = b moveNode(aRef, bRef) return head;def display(head) : curr = head while (curr != None) : print( curr.data,end = " ") curr = curr.next # Driver code head = Nonehead = push(head, 7) head = push(head, 6) head = push(head, 5) head = push(head, 4) head = push(head, 3) head = push(head, 2) head = push(head, 1) head=alternateSplitLinkedList(head) print("a : ",end="") display(a) print("\nb : ",end="") display(b) # This code is contributed by Arnab Kundu |
C#
// C# code to split linked listusing System;class GFG{ // Node structurepublic class Node { public int data; public Node next;};// Function to push nodes// into linked liststatic Node push(Node head, int new_data){ Node new_node = new Node(); new_node.data = new_data; new_node.next = (head); (head) = new_node; return head;}static Node a = null, b = null;// We basically remove link between 'a'// and its next. Similarly we remove link// between 'b' and its next. Then we recur// for remaining lists.static void moveNode(Node a, Node b){ if (b == null || a == null) return; if (a.next != null) a.next = a.next.next; if (b.next != null) b.next = b.next.next; moveNode(a.next, b.next);}// function to split linked liststatic void alternateSplitLinkedList(Node head){ Node curr = head; a = curr; b = curr.next; Node aRef = a, bRef = b; moveNode(aRef, bRef);}static void display(Node head){ Node curr = head; while (curr != null) { Console.Write("{0} ", curr.data); curr = curr.next; }}// Driver codepublic static void Main(String []args){ Node head = null; head = push(head, 7); head = push(head, 6); head = push(head, 5); head = push(head, 4); head = push(head, 3); head = push(head, 2); head = push(head, 1); alternateSplitLinkedList(head); Console.Write("a : "); display(a); Console.Write("\nb : "); display(b);}}// This code is contributed by PrinciRaj1992 |
Javascript
<script>// JavaScript code to split linked list// Node structureclass Node { constructor() { this.data = 0; this.next = null }};// Function to push nodes// into linked listfunction push(head, new_data){ var new_node = new Node(); new_node.data = new_data; new_node.next = (head); (head) = new_node; return head;}var a = null, b = null;// We basically remove link between 'a'// and its next. Similarly we remove link// between 'b' and its next. Then we recur// for remaining lists.function moveNode(a, b){ if (b == null || a == null) return; if (a.next != null) a.next = a.next.next; if (b.next != null) b.next = b.next.next; moveNode(a.next, b.next);}// function to split linked listfunction alternateSplitLinkedList(head){ var curr = head; a = curr; b = curr.next; var aRef = a, bRef = b; moveNode(aRef, bRef);}function display(head){ var curr = head; while (curr != null) { document.write(curr.data+ " "); curr = curr.next; }}// Driver codevar head = null; head = push(head, 7);head = push(head, 6);head = push(head, 5);head = push(head, 4);head = push(head, 3);head = push(head, 2);head = push(head, 1);alternateSplitLinkedList(head);document.write("a : ");display(a);document.write("<br>b : ");display(b);</script> |
Output:
a : 1 3 5 7 b : 2 4 6
Time Complexity: O(N)
Auxiliary Space: O(N)
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 zambiatek!
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



