Perform experiments to determine the average size of the smaller partition in each quicksort partition operation, as a fraction of the number of elements being partitioned.
Perform experiments to compare the relative efficiency of merge sort and quicksort.
We can use this class to represent a linked list node:
class Node:
def __init__(self, val, next):
self.val = val
self.next = nextWrite a function hasAdjacent(n) that takes a pointer to the first Node in a linked list and returns True if any two adjacent elements in the list have the same value, otherwise False.s
4. Prepend
You are given a
class LinkedList
with an attribute
head that
points to the head of a linked list of
Node objects:
class LinkedList:
def __init__(self, head):
self.head = headWrite a method that prepends a value to a LinkedList.
Write a method that
appends a value to a LinkedList.
Modify the LinkedList class so that the append() method runs efficiently (i.e. in O(1)).
Write a method that
deletes the first node (if any) in a LinkedList.
Write a method
that deletes the last node (if any) in a LinkedList.
Write a function split() that takes a pointer to the the first Node in a linked list and splits the list into two linked lists of roughly equal size. Return a pair containing these lists. The elements in the returned lists may appear in any order.
Write a function merge() that takes pointer to the first Nodes of two sorted lists and combines them into a single sorted list.
Write a function merge_sort() that performs a merge sort on a linked list, returning a pointer to a sorted list. Do not allocate any new list nodes while sorting.