我已经成功地实现了向后链表,但我试图找出如何实现前向链表,但我似乎无法弄清楚如何做到这一点。 问题出在我的insert
方法上。 我正在尝试跟踪上一个节点,并将其指向新创建的节点,但我缺少一些东西。
class Node(object):
def __init__(self, data=None, next_node=None):
self.data = data
self.next_node = next_node
def set_next(self, new_next):
self.next_node = new_next
def get_data(self):
return self.data
def get_next(self):
return self.next_node
class LinkedList(object):
def __init__(self, head=None):
self.head = head
def insert(self, data):
previous_node = self.head
current_node = self.head
new_node = Node(data)
if previous_node is not None:
previous_node.set_next(new_node)
previous_node = self.head
目前尚不清楚您的insert
方法应该做什么。如果它打算插入列表的开头(在 head 之前(,那么您应该设置 new_node.set_next(previous_node)
和 self.head = new_node
.如果您打算附加到列表的末尾,则需要扫描列表,直到找到具有current_node.get_next() == None
的节点并执行current_node.set_next(new_node)
。
由于这看起来像家庭作业,我不想直接给你答案。我将提供一些伪代码来帮助您入门
def insert(value):
let current = head
until current.next_node == None:
let current = current.next_node
let current.next_node = Node2(value)
试试这个。
如果列表为空,则设置标题并返回。否则,遍历所有元素的"向前"循环,直到到达None
节点。完成后,设置适当的next_node
值。
class LinkedList(object):
def __init__(self, head=None):
self.head = head
def empty(self):
return self.head is None
def insert(self, data):
new_node = Node(data) # Want to insert this
if self.empty(): # Is this list empty?
self.head = new_node # Yes? Then add the head
else: # No? There are elements in the list
current_node = self.head # Save a moving reference
while not current_node.get_next() is None: # While there are forward nodes
current_node = current_node.get_next() # Move the reference forward
current_node.set_next(new_node) # Set the last node, thus inserting at the "end"
让我们写出它的作用:
def insert(self, data):
previous_node = self.head # set to head of list
current_node = self.head # not used elsewhere
new_node = Node(data) # make a new node with the given data.
if previous_node is not None: # if the list isn't empty
previous_node.set_next(new_node) # point the list head to the new node
previous_node = self.head # does nothing; this was already the list head
底线:这将创建一个新节点,并使其成为列表头的"下一个"节点。 这就是这一切;您的列表长度永远不会超过 2 个节点。 事实上,您的列表永远无法获得第一个节点,因为您没有代码可以插入到空列表中。
要解决此问题,您需要一个清晰、适应性强的算法,例如:
Create a new node.
Link the existing list behind the new node:
Set new.next to the current head node.
Point the list head to the new node.
请注意,即使对于空列表,这也有效。
如果你想要一个添加到末尾的列表,那么还要维护一个指向列表中最后一个节点的 self.tail 属性。 然后您的插入(附加(如下所示:
Create a new node.
Link the new node to the existing tail:
if tail exists:
Set tail.next to the new node.
else:
Set head to the new node
Set tail to the new node.
这是否足够清楚,可以实施?