chore(CPlusPlus): add reorder list (#373)

Co-authored-by: Arsenic <54987647+Arsenic-ATG@users.noreply.github.com>
pull/351/head
Ujjwal 2021-06-26 20:29:39 +05:30 committed by GitHub
parent f4658d3413
commit 6bc975f513
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 128 additions and 0 deletions

View File

@ -0,0 +1,127 @@
/* Program to reorder a LinkedList in the below given way
For example: Given 1->2->3->4->5 its reorder is 1->5->2->4->3. */
#include <iostream>
using namespace std;
// Linked list Node
struct Node
{
int data;
struct Node * next;
Node(int x)
{
data = x;
next = NULL;
}
};
void reorderList(struct Node * head);
// Function to create a new Node with given data
struct Node * newNode(int data)
{
struct Node * new_Node = new Node(data);
new_Node -> data = data;
new_Node -> next = NULL;
return new_Node;
}
// Function to printList
void printList(struct Node * Node)
{
while (Node != NULL)
{
printf("%d ", Node -> data);
Node = Node -> next;
}
printf("\n");
}
// Function to freeList
void freeList(struct Node * head)
{
struct Node * temp;
while (head != NULL)
{
temp = head;
head = head -> next;
free(temp);
}
}
// driver code
int main()
{
int n, m, i, x;
struct Node * temp, * head;
cout << "Enter the size: ";
cin >> n;
cin >> x;
head = new Node(x);
temp = head;
for (i = 0; i < n - 1; i++)
{
cin >> x;
temp -> next = new Node(x);
temp = temp -> next;
}
reorderList(head);
printList(head);
freeList(head);
return 0;
}
// Function to reorderList
void reorderList(Node * head)
{
Node * fast = head, * slow = head, * prev = NULL, * t;
Node * new_head;
if (head -> next != NULL && head != NULL)
{
while (fast != NULL && fast -> next != NULL)
{
prev = slow;
fast = fast -> next -> next;
slow = slow -> next;
}
/* now prev is pointing the middle node of list and fast is pointing the last Node of the list,
split the list into two parts and new head will point the 2 part */
prev -> next = NULL;
new_head = slow;
fast = NULL;
// will slow is not equal to NULL means the new_head!=empty run the loop and reverse the List
while (slow)
{
t = slow -> next;
slow -> next = fast;
fast = slow;
slow = t;
}
new_head = fast;
t = head;
/* now pick alternate node from both and add it in the right place */
while (t)
{
slow = new_head;
new_head = new_head -> next;
slow -> next = t -> next;
t -> next = slow;
prev = t -> next;
t = t -> next -> next;
}
if (new_head != NULL)
{
prev -> next = new_head;
}
}
}
/*
Input: Enter the size: 5
5,4,3,2,1
Output:5,1,4,2,3
Time complexity: O(N)
Space Complexity: O(1)
*/

View File

@ -26,6 +26,7 @@
4. [Circular linked lists](Linked-Lists/circular.cpp) 4. [Circular linked lists](Linked-Lists/circular.cpp)
5. [Reversing a linked lists](Linked-Lists/reverse.cpp) 5. [Reversing a linked lists](Linked-Lists/reverse.cpp)
5. [Merging two sorted linked lists](Linked-Lists/merge.cpp) 5. [Merging two sorted linked lists](Linked-Lists/merge.cpp)
6. [Reorder List](Linked-Lists/Reorder-List.cpp)
## Searching ## Searching
1. [Linear Search](Searching/linear-search.cpp) 1. [Linear Search](Searching/linear-search.cpp)