#include <bits/stdc++.h>
using
namespace
std;
class
Node
{
public
:
int
data;
Node *next, *prev;
};
Node *split(Node *head);
Node *merge(Node *first, Node *second)
{
if
(!first)
return
second;
if
(!second)
return
first;
if
(first->data < second->data)
{
first->next = merge(first->next,
second);
first->next->prev = first;
first->prev = NULL;
return
first;
}
else
{
second->next = merge(first,second->next);
second->next->prev = second;
second->prev = NULL;
return
second;
}
}
Node *mergeSort(Node *head)
{
if
(!head || !head->next)
return
head;
Node *second = split(head);
head = mergeSort(head);
second = mergeSort(second);
return
merge(head,second);
}
void
insert(Node **head,
int
data)
{
Node *temp =
new
Node();
temp->data = data;
temp->next = temp->prev = NULL;
if
(!(*head))
(*head) = temp;
else
{
temp->next = *head;
(*head)->prev = temp;
(*head) = temp;
}
}
void
print(Node *head)
{
Node *temp = head;
cout <<
"Forward Traversal using next pointer"
;
while
(head)
{
cout << head->data <<
" "
;
temp = head;
head = head->next;
}
cout <<
"Backward Traversal using prev pointer"
;
while
(temp)
{
cout << temp->data <<
" "
;
temp = temp->prev;
}
}
void
swap(
int
*A,
int
*B)
{
int
temp = *A;
*A = *B;
*B = temp;
}
Node *split(Node *head)
{
Node *fast = head,*slow = head;
while
(fast->next && fast->next->next)
{
fast = fast->next->next;
slow = slow->next;
}
Node *temp = slow->next;
slow->next = NULL;
return
temp;
}
int
main(
void
)
{
Node *head = NULL;
insert(&head, 5);
insert(&head, 20);
insert(&head, 4);
insert(&head, 3);
insert(&head, 30);
insert(&head, 10);
head = mergeSort(head);
cout <<
"Linked List after sorting"
;
print(head);
return
0;
}