# Recursive approach for alternating split of Linked List

• Difficulty Level : Easy
• Last Updated : 23 Jan, 2023

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 ``using` `namespace` `std;` `// Node structure``struct` `Node {``    ``int` `data;``    ``struct` `Node* next;``};` `// Function to push nodes``// into linked list``void` `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 list``void` `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 code``int` `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 list``class` `GFG``{``    ` `// Node structure``static` `class` `Node``{``    ``int` `data;``    ``Node next;``};` `// Function to push nodes``// into linked list``static` `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 list``static` `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 code``public` `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 ``=` `None``b ``=` `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 ``=` `None``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``)``    ` `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 list``using` `System;` `class` `GFG``{``    ` `// Node structure``public` `class` `Node``{``    ``public` `int` `data;``    ``public` `Node next;``};` `// Function to push nodes``// into linked list``static` `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 list``static` `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 code``public` `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

 ``

Output:

```a : 1 3 5 7
b : 2 4 6 ```

Time Complexity: O(N)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up