chore(CPlusPlus): add reorder list (#373)
Co-authored-by: Arsenic <54987647+Arsenic-ATG@users.noreply.github.com>pull/351/head
parent
f4658d3413
commit
6bc975f513
|
@ -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)
|
||||
*/
|
|
@ -26,6 +26,7 @@
|
|||
4. [Circular linked lists](Linked-Lists/circular.cpp)
|
||||
5. [Reversing a linked lists](Linked-Lists/reverse.cpp)
|
||||
5. [Merging two sorted linked lists](Linked-Lists/merge.cpp)
|
||||
6. [Reorder List](Linked-Lists/Reorder-List.cpp)
|
||||
|
||||
## Searching
|
||||
1. [Linear Search](Searching/linear-search.cpp)
|
||||
|
|
Loading…
Reference in New Issue