def insert_head(self, node: ListNode): head_o = self.head() node.next_node = head_o head_o.prev_node = node node.prev_node = None self.__head = node self.__length += 1
def insert_tail(self, node: ListNode): tail_o = self.tail() node.prev_node = tail_o tail_o.next_node = node node.next_node = None self.__tail = node self.__length += 1
def insert_tail(self, node: ListNode): tail_o = self.tail() self.__anchor.prev_node = node node.prev_node = tail_o tail_o.next_node = node node.next_node = self.__anchor self.__length += 1
def insert_head(self, node: ListNode): head_o = self.head() self.__anchor.next_node = node node.next_node = head_o head_o.prev_node = node node.prev_node = self.__anchor self.__length += 1
def append(self, node: ListNode): self.__tail.next_node = node self.__tail = node if node is not None: node.next_node = None self.__length += 1
def insert_head(self, node: ListNode): if self.head() is None: self.__head = node else: head_o = self.head() node.next_node = head_o self.__head = node self.__length += 1
def __merge(self, left: ListNode, right: ListNode): if left == self.__anchor: return right if right == self.__anchor: return left # Compare two ListNodes and return the head choice = self.__compare(left, right) if choice == 0: next_n = self.__merge(left.next_node, right.next_node) left.next_node = next_n next_n.prev_node = left return left elif choice < 0: next_n = self.__merge(left.next_node, right) left.next_node = next_n next_n.prev_node = left return left else: next_n = self.__merge(left, right.next_node) right.next_node = next_n next_n.prev_node = right return right
def merge_sort_k_way_(self, lists: [LinkedList_Double_Circular], last: int): while last != 0: i = 0 j = last # Sort a pair lists while i < j: ListNode(lists[0]).head = self.__merge_k_way( lists[i], lists[j]) i += 1 j -= 1 # Done with one round if i >= j: last = j return lists[0]
def __merge_k_way(self, left: LinkedList_Double_Circular, right: LinkedList_Double_Circular): head = p = ListNode() anchor_left = left.get_anchor() anchor_right = right.get_anchor() left_n = left.head right_n = right.head # Compare the add to sorted list while left_n != anchor_left and right_n != anchor_right: choice = self.__compare(left_n, right_n) if choice == 0: p.next_node = left_n left_n.prev_node = p left_n = left_n.next_node right_n = right_n.next_node elif choice < 0: p.next_node = left_n left_n.prev_node = p left_n = left_n.next_node else: p.next_node = right_n right_n.prev_node = p right_n = right_n.next_node # Add the rest of the nodes if left_n != anchor_left: p.next_node = left_n left_n.prev_node = p else: p.next_node = right_n right_n.prev_node = p return head.next_node
def __init__(self): self.__anchor = ListNode() self.__anchor.next_node = self.__anchor self.__anchor.prev_node = self.__anchor self.__length = 0