I am trying to implement a deep copy function that is given a nested doubly linked list of integers (code for DoublyLinkedList at the end). So far, my code doesn't do what it's suppose to even with the deep copy method. I'm not sure what else to try so any pointers would be amazing!
My Code
def deep_copy_linked_list(lnk_lst):
if lnk_lst.is_empty:
return lnk_lst
head = lnk_lst.delete_first()
temp = DoublyLinkedList()
while not lnk_lst.is_empty():
if isinstance(head.data, DoublyLinkedList):
while not isinstance(head.data, DoublyLinkedList):
headcopy = head.data[:]
temp.add_last(headcopy)
else:
temp.add_last(head.data)
head = head.next
return temp
I'm still learning about nodes so I'm not sure if slicing head.data in place of copying is allowed. This is the code I'm using to test. The expected output is 1 but I keep getting 10.
elem1 = DoublyLinkedList()
elem1.add_last(1)
elem1.add_last(2)
lnk_lst1.add_last(elem1)
elem2 = 3
lnk_lst1.add_last(elem2)
lnk_lst2 = deep_copy_linked_list(lnk_lst1)
e1 = lnk_lst1.header.next
e1_1 = e1.data.header.next
e1_1.data = 10
e2 = lnk_lst2.header.next
e2_1 = e2.data.header.next
print(e2_1.data)
Doulby Linked List class
class DoublyLinkedList:
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
self.prev = None
def disconnect(self):
self.data = None
self.next = None
self.prev = None
def __init__(self):
self.header = DoublyLinkedList.Node()
self.trailer = DoublyLinkedList.Node()
self.header.next = self.trailer
self.trailer.prev = self.header
self.size = 0
def __len__(self):
return self.size
def is_empty(self):
return (len(self) == 0)
def add_after(self, node, val):
new_node = DoublyLinkedList.Node(val)
prev_node = node
next_node = prev_node.next
prev_node.next = new_node
new_node.prev = prev_node
next_node.prev = new_node
new_node.next = next_node
self.size += 1
return new_node
def add_first(self, val):
return self.add_after(self.header, val)
def add_last(self, val):
return self.add_after(self.trailer.prev, val)
def add_before(self, node, val):
return self.add_after(node.prev, val)
def delete_node(self, node):
prev_node = node.prev
next_node = node.next
prev_node.next = next_node
next_node.prev = prev_node
self.size -= 1
data = node.data
node.disconnect()
return data
def delete_first(self):
if(self.is_empty() == True):
raise Exception("List is empty")
return self.delete_node(self.header.next)
def delete_last(self):
if(self.is_empty() == True):
raise Exception("List is empty")
return self.delete_node(self.trailer.prev)
def __iter__(self):
cursor = self.header.next
while(cursor is not self.trailer):
yield cursor.data
cursor = cursor.next
def __repr__(self):
return "[" + " <--> ".join([str(elem) for elem in self]) + "]"