
- C++ Basics
- C++ Home
- C++ Overview
- C++ Environment Setup
- C++ Basic Syntax
- C++ Comments
- C++ Data Types
- C++ Variable Types
- C++ Variable Scope
- C++ Constants/Literals
- C++ Modifier Types
- C++ Storage Classes
- C++ Operators
- C++ Loop Types
- C++ Decision Making
- C++ Functions
- C++ Numbers
- C++ Arrays
- C++ Strings
- C++ Pointers
- C++ References
- C++ Date & Time
- C++ Basic Input/Output
- C++ Data Structures
- C++ Object Oriented
- C++ Classes & Objects
- C++ Inheritance
- C++ Overloading
- C++ Polymorphism
- C++ Abstraction
- C++ Encapsulation
- C++ Interfaces
Alternate sorting of Linked list in C++
A linked list is a linear data structure that stores elements and also stores a pointer to the next data node.
In this problem on the sorting of a linked list, the alternate sort means sorting in such a way that the 1st node contains data with the minimum value, the 2nd node contains data with maximum value, 3rd with the next minimum (second minimum value) and so on. This pattern of alternate maxima and minimas is created in alternate sorting of linked lists.
Let’s take an example to understand the problem better −
Input : 3 > 4 > 21 >67 > 1 > 8. Output : 1 > 67 > 3 > 21 > 4 > 8. Explanation : Sort order of elements is 1 , 3 , 4 ,8 ,21 ,67. For required output we need to take one value from the beginning and one from end and it outputs the result.
Now, as we know about the problem. We will try to find a solution to this problem. So, now since we need to alternate minima and maxima we should sort the linked lists accordingly. For this, any linked list sorting can be used. Then we will take one value from the start and one from the end. It is better to use two different lists to avoid overlapping. We will reverse the latter of the two halves and then merge them back in alternate order. Since we have to use some sections of the merge sorting technique, for sorting also merge sort is quite efficient.
Algorithm
Step 1 : Sort the linked list using merge sort technique. Step 2 : Create two linked list of half the length of the original linked list. Now, place one half in first half linked list and other half in second half linked list. Step 3 : reverse the second linked list and store in new linked list (required for reversal ). Step 4 : Create the result linked list using the first and reverse linked list. Using the elements of both list in alternate order.
Example
#include <bits/stdc++.h> using namespace std; struct Node { int data; struct Node* next; }; Node* getNode(int data){ Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } void FrontBackSplit(Node* source, Node** frontRef, Node** backRef) ; Node* SortedMerge(Node* a, Node* b) ; void MergeSort(Node** headRef) ; void alternateMerge(Node* head1, Node* head2) ; Node* altSortLinkedList(Node* head) ; void printList(Node* head) ; static void reverse(Node** head_ref){ Node* prev = NULL; Node* current = *head_ref; Node* next; while (current != NULL) { next = current->next; current->next = prev; prev = current; current = next; } *head_ref = prev; } int main(){ Node* head = getNode(3); head->next = getNode(4); head->next->next = getNode(21); head->next->next->next = getNode(67); head->next->next->next->next = getNode(1); head->next->next->next->next->next = getNode(8); cout << "Initial list: "; printList(head); head = altSortLinkedList(head); cout << "\nSorted list: "; printList(head); return 0; } void FrontBackSplit(Node* source, Node** frontRef, Node** backRef){ Node* fast; Node* slow; if (source == NULL || source->next == NULL) { *frontRef = source; *backRef = NULL; } else { slow = source; fast = source->next; while (fast != NULL) { fast = fast->next; if (fast != NULL) { slow = slow->next; fast = fast->next; } } *frontRef = source; *backRef = slow->next; slow->next = NULL; } } Node* SortedMerge(Node* a, Node* b){ Node* result = NULL; if (a == NULL) return b; else if (b == NULL) return a; if (a->data <= b->data) { result = a; result->next = SortedMerge(a->next, b); } else { result = b; result->next = SortedMerge(a, b->next); } return result; } void MergeSort(Node** headRef){ Node* head = *headRef; Node *a, *b; if ((head == NULL) || (head->next == NULL)) return; FrontBackSplit(head, &a, &b); MergeSort(&a); MergeSort(&b); *headRef = SortedMerge(a, b); } void alternateMerge(Node* head1, Node* head2){ Node *p, *q; while (head1 != NULL && head2 != NULL) { p = head1->next; head1->next = head2; head1 = p; q = head2->next; head2->next = head1; head2 = q; } } Node* altSortLinkedList(Node* head){ MergeSort(&head); Node *front, *back; FrontBackSplit(head, &front, &back); reverse(&back); alternateMerge(front, back); return front; } void printList(Node* head){ while (head != NULL) { cout << head->data << " "; head = head->next; } }
Output
Initial list: 3 4 21 67 1 8 Sorted list: 1 67 3 21 4 8
- Related Articles
- Product of the alternate nodes of linked list
- Delete alternate nodes of a Linked List in C++
- Merge a linked list into another linked list at alternate positions in Java
- Sum of the alternate nodes of linked list in C++
- Print alternate nodes of a linked list using recursion in C++
- JavaScript Program To Delete Alternate Nodes Of A Linked List
- Print the alternate nodes of linked list (Iterative Method) in C language
- Reverse Alternate K Nodes in a Singly Linked List in C++
- Alternate Odd and Even Nodes in a Singly Linked List in C++
- Python Program to Print the Alternate Nodes in a Linked List using Recursion
- Python Program to Print the Alternate Nodes in a Linked List without using Recursion
- Alternate range slicing in list (Python)
- Alternate element summation in list (Python)
- List consisting of all the alternate elements in Python
- Custom sorting in list of tuples in Python
