Merge Sort for Doubly Linked List Python
- Get link
- X
- Other Apps
PROGRAM TO IMPLEMENT MERGE SORT ON DOUBLY LINKED LIST
class
Node:
# Constructor to create a new node
def
__init__(
self
, data):
self
.data
=
data
self
.
next
=
None
self
.prev
=
None
class
DoublyLinkedList:
# Constructor for empty Doubly Linked List
def
__init__(
self
):
self
.head
=
None
# Function to merge two linked list
def
merge(
self
, first, second):
# If first linked list is empty
if
first
is
None
:
return
second
# If secon linked list is empty
if
second
is
None
:
return
first
# Pick the smaller value
if
first.data < second.data:
first.
next
=
self
.merge(first.
next
, second)
first.
next
.prev
=
first
first.prev
=
None
return
first
else
:
second.
next
=
self
.merge(first, second.
next
)
second.
next
.prev
=
second
second.prev
=
None
return
second
# Function to do merge sort
def
mergeSort(
self
, tempHead):
if
tempHead
is
None
:
return
tempHead
if
tempHead.
next
is
None
:
return
tempHead
second
=
self
.split(tempHead)
# Recur for left and righ halves
tempHead
=
self
.mergeSort(tempHead)
second
=
self
.mergeSort(second)
# Merge the two sorted halves
return
self
.merge(tempHead, second)
# Split the doubly linked list (DLL) into two DLLs
# of half sizes
def
split(
self
, tempHead):
fast
=
slow
=
tempHead
while
(
True
):
if
fast.
next
is
None
:
break
if
fast.
next
.
next
is
None
:
break
fast
=
fast.
next
.
next
slow
=
slow.
next
temp
=
slow.
next
slow.
next
=
None
return
temp
# Given a reference to the head of a list and an
# integer,inserts a new node on the front of list
def
push(
self
, new_data):
# 1. Allocates node
# 2. Put the data in it
new_node
=
Node(new_data)
# 3. Make next of new node as head and
# previous as None (already None)
new_node.
next
=
self
.head
# 4. change prev of head node to new_node
if
self
.head
is
not
None
:
self
.head.prev
=
new_node
# 5. move the head to point to the new node
self
.head
=
new_node
def
printList(
self
, node):
temp
=
node
print
"Forward Traversal using next poitner"
while
(node
is
not
None
):
print
node.data,
temp
=
node
node
=
node.
next
print
"\nBackward Traversal using prev pointer"
while
(temp):
print
temp.data,
temp
=
temp.prev
# Driver program to test the above functions
dll
=
DoublyLinkedList()
dll.push(
5
)
dll.push(
20
);
dll.push(
4
);
dll.push(
3
);
dll.push(
30
)
dll.push(
10
);
dll.head
=
dll.mergeSort(dll.head)
print
"Linked List after sorting"
dll.printList(dll.head)
OUTPUT:
Linked List after sorting Forward Traversal using next pointer 3 4 5 10 20 30 Backward Traversal using prev pointer 30 20 10 5 4 3
- Get link
- X
- Other Apps
Comments
Post a Comment