"Ein Buch zum Trainieren von Programmierkenntnissen für den Kampf in der Welt" Python-Code-Antwortbeispiel --2.5 Summe zweier in der Liste angezeigter Zahlen
python
from chap2_function import*
def dll_from_node(node):
dll = DoublyLinkedList()
while(node is not None):
dll.append(node.data)
last = node
node = node.next
return dll
def addLists(l1,l2,carry):
if l1==None and l2==None and carry==0:
return None
value = carry
if l1:
value = value + l1.data
if l2:
value = value + l2.data
result=Node(value%10)
if l1 or l2:
more = addLists(None if l1==None else l1.next,
None if l2==None else l2.next,
1 if value >= 10 else 0
)
result.next = more
return result
dll_1 = DoublyLinkedList()
# DLL: None -> 7(Kopf) -> 1 -> 6(letzte) -> None
dll_1.append(7)
dll_1.append(1)
dll_1.append(6)
dll_1.printList(dll_1.head)
dll_2 = DoublyLinkedList()
# DLL: None -> 7(Kopf) -> 1 -> 6(letzte) -> None
dll_2.append(5)
dll_2.append(9)
dll_2.append(2)
dll_2.printList(dll_2.head)
result_1 = addLists(dll_1.head,dll_2.head,0)
dll_result_1 = dll_from_node(result_1)
dll_result_1.printList(dll_result_1.head)
dll_3 = DoublyLinkedList()
# DLL: None -> 9(Kopf) -> 9 -> 9(letzte) -> None
dll_3.append(9)
dll_3.append(9)
dll_3.append(9)
dll_3.printList(dll_3.head)
dll_4 = DoublyLinkedList()
# DLL: None -> 9(Kopf) -> 9 -> 9(letzte) -> None
dll_4.append(9)
dll_4.append(9)
dll_4.append(9)
dll_4.printList(dll_4.head)
result_2 = addLists(dll_3.head,dll_4.head,0)
dll_result_2 = dll_from_node(result_2)
dll_result_2.printList(dll_result_2.head)
chap2_function.py
#Knotenklasse
class Node:
#Konstrukteur
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
#Bidirektionale Listenklasse
class DoublyLinkedList:
#Konstrukteur
def __init__(self):
self.head = None
#Knoten vom ersten Knoten einfügen
def push(self, new_data):
#Knotengenerierung
new_node = Node(new_data)
#Machen Sie den nächsten Knoten des neuen Knotens zu dem, der an erster Stelle der Hauptknoten war
new_node.next = self.head
#Obwohl es sich in erster Linie um einen Kopfknoten handelte, wird der vorherige Knoten in einen neuen Knoten geändert
if self.head is not None:
self.head.prev = new_node
#Machen Sie den neuen Knoten zu einem Kopfknoten
self.head = new_node
#Einfügen eines Knotens an einem Zwischenpunkt
def insert(self, prev_node, new_data):
# prev_Geben Sie an, ob ein Knoten nach dem vom Knoten angegebenen Knoten eingefügt werden soll
#Wenn Keine, beenden Sie die Funktion
if prev_node is None:
print("the given previous node cannot be NULL")
return
#Knotengenerierung
new_node = Node(new_data)
#Zurück zum nächsten Knoten des neuen Knotens_Machen Sie es zum nächsten Knoten des vom Knoten angegebenen Knotens
new_node.next = prev_node.next
# prev_Macht den nächsten Knoten des vom Knoten angegebenen Knotens zu einem neuen Knoten
prev_node.next = new_node
#Zurück zum vorherigen Knoten des neuen Knotens_Machen Sie es zum Knoten, der vom Knoten angegeben wird
new_node.prev = prev_node
#Zurück zum nächsten Knoten des neuen Knotens_Ich habe es zum nächsten Knoten des in Knoten angegebenen Knotens gemacht, aber der vorherige Knoten dieses Knotens wird auch zu einem neuen Knoten gemacht
if new_node.next is not None:
new_node.next.prev = new_node
#Knoten vom letzten Knoten einfügen
def append(self, new_data):
#Knotengenerierung
new_node = Node(new_data)
#Keine Definition des nächsten Knotens des neuen Knotens
new_node.next = None
#Wenn kein Kopfknoten festgelegt ist (leere Liste), legen Sie einen neuen Knoten als Kopfknoten fest
if self.head is None:
new_node.prev = None
self.head = new_node
return
#Stellen Sie den endgültigen Knoten ein (Vorwärtsscannen)
last = self.head
while(last.next is not None):
last = last.next
#Legen Sie einen neuen Knoten als letzten Knoten fest
last.next = new_node
# 7.Machen Sie den vorherigen Knoten des neuen Knotens zum letzten Knoten überhaupt
new_node.prev = last
return
def delete(self,del_node):
if self.head == None or del_node == None:
return
if self.head == del_node:
self.head = del_node.next
if del_node.next != None:
del_node.next.prev = del_node.prev
if del_node.prev != None:
del_node.prev.next = del_node.next
def printList(self, node):
print("Bidirektionale Liste: \n")
print("Vorwärtsscannen")
while(node is not None):
print(node.data,end="")
last = node
node = node.next
if node:
print(" -> ",end="")
else:
print("\n")
print("Reverse Scannen")
while(last is not None):
print(last.data,end="")
last = last.prev
if last:
print(" -> ",end="")
else:
print("\n")
if __name__ == '__main__':
#Generieren Sie eine leere bidirektionale Liste
# DLL: None
dll = DoublyLinkedList()
# DLL: None -> 6(Kopf/letzte) -> None
dll.append(6)
# DLL: None -> 7(Kopf) -> 6(letzte) -> None
dll.push(7)
# DLL: None -> 1(Kopf) -> 7 -> 6(letzte) -> None
dll.push(1)
# DLL: None -> 1(Kopf) -> 7 -> 6 -> 4(letzte) -> None
dll.append(4)
# DLL: None -> 1(Kopf) -> 7 -> 8 -> 6 -> 4(letzte) -> None
dll.insert(dll.head.next, 8)
# DLL: None -> 1(Kopf) -> 8 -> 6 -> 4(letzte) -> None
dll.delete(dll.head.next)
dll.printList(dll.head)
[1] GeeksforGeeks: Doubly Linked List | Set 1 (Introduction and Insertion) [2] GeeksforGeeks: Delete a node in a Doubly Linked List