diff --git a/algorithms/CPlusPlus/Linked-Lists/Reorder-List.cpp b/algorithms/CPlusPlus/Linked-Lists/Reorder-List.cpp new file mode 100644 index 00000000..aa892ace --- /dev/null +++ b/algorithms/CPlusPlus/Linked-Lists/Reorder-List.cpp @@ -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 +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) +*/ diff --git a/algorithms/CPlusPlus/README.md b/algorithms/CPlusPlus/README.md index cc9cb207..bf377b7d 100644 --- a/algorithms/CPlusPlus/README.md +++ b/algorithms/CPlusPlus/README.md @@ -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)