I'm trying to understand how the __repr__ method gets called and the nodes list gets updated during invocation of class's other methods. Sorry if my terminology isn't correct. I've only included the prepend and append methods for brevity. It looks to me like the list "nodes" would get initialized over and over again. Thanks!
class Node:
"""A node in a singly-linked list"""
def __init__(self, dataval=None, nextval=None):
self.dataval = dataval
self.nextval = nextval
def __repr__(self):
return repr(self.dataval)
class LinkedList:
def __init__(self):
"""Creating a new singly-linked list."""
self.head = None
def __repr__(self):
"""Creating a string representation of the data field in a list"""
nodes = []
curr = self.head
while curr:
nodes.append(repr(curr))
curr = curr.nextval
return '[' '->'.join(nodes) ']'
def prepend(self, dataval):
"""Insert a new element at the beginning of the list."""
self.head = Node(dataval=dataval, nextval=self.head)
def append(self, dataval):
"""Insert a new element at the end of the list."""
if not self.head:
self.head = Node(dataval=dataval)
return
curr = self.head
while curr.nextval:
curr = curr.nextval
curr.nextval = Node(dataval=dataval)
The code works, I just don't understand quite how it works. It's from an online course about data structures.
CodePudding user response:
Inside the LinkedList's __repr__ you create a new local nodes list, you call the __repr__ of all of the nodes by passing on their nextval attribute and add their string representation to the list, and then concatenate the list together using '->'.join().
CodePudding user response:
You seem to be confused about the call to append in __repr__: that is not a call to the append method in your class. It is calling append on a native list type. The two methods happen to have the same name, and I guess that's where the mixup comes from.
The __repr__ method creates a list (not a LinkedList) and populates it with the string representations of the nodes in the linked list. Then it joins those strings to one string and returns it. During this process no other method of the LinkedList class is called.
CodePudding user response:
__repr__ isn't called in the prepend and append routines. The nodes list in LinkedList.__rep__ is only there temporarily to hold the nodes while its return value is built. In fact, your classes don't use list to hold nodes at all. LinkedList has a reference to the first Node in head and each Node has a reference to the next node in nextval.
