W pewnych zastosowaniach list możemy wymagać, aby lista była stale posortowana. Potrzebujemy funkcji insert(), która będzie wstawiała elementy do listy we właściwe miejsce. Największy element będzie znajdował się na początku listy.
Funkcja insert() ma zwracać nowy początek listy.
def insert(node, new_node):
before = None # robię widełki
after = node # może być None
while after:
if after.data < new_node.data:
break
before = after
after = after.next
if before is None: # przed początkiem listy
new_node.next = node
return new_node # nowy head
else: # jesteśmy w głębi listy, może na końcu
new_node.next = after
before.next = new_node
return node # stary head
Napiszemy funkcję merge(), która będzie łączyć dwie listy posortowane w jedną listę posortowaną. Funkcja zwraca początek wspólnej listy.
def merge(node1, node2):
# Najpierw trzeba ustalić początek listy.
if node1:
if node2:
if node1.data > node2.data:
head = node1
node1 = node1.next
else:
head = node2
node2 = node2.next
else:
return node1
else:
return node2
last = head # na pewno różny od None
# Teraz przetwarzamy obie listy.
while node1 is not None and node2 is not None:
if node1.data > node2.data:
last.next = node1
node1 = node1.next
else:
last.next = node2
node2 = node2.next
last = last.next
# Jedna lista mogła zostać niepusta.
if node1:
last.next = node1
if node2:
last.next = node2
return head
Budujemy listę posortowaną, gdzie największy element będzie się znajdował na początku listy.
def insert_sorted(pair, node):
if pair[0] is None: # pusta lista
pair[0] = pair[1] = node
return
# Dalej lista nie jest pusta.
after = pair[0]
while after: # szukamy miejsca wstawienia
if after.data < node.data:
break
after = after.next
if after is None: # wstawiamy na koniec listy
node.prev = pair[1]
pair[1].next = node
pair[1] = node
elif after is pair[0]: # wstawiamy na początek listy
node.next = pair[0]
pair[0].prev = node
pair[0] = node
else: # jesteśmy w srodku listy
node.prev = after.prev
node.next = after
after.prev.next = node
after.prev = node
Napiszemy funkcję merge(), która będzie łączyć dwie listy posortowane w jedną listę posortowaną. Funkcja zwraca nową listę.
def merge(pair1, pair2): pass