插入双向链表中的任意位置

insert at arbitrary position in doubly linked sentinel list

我知道如何将一个项目附加到双向链接的哨兵列表中,并且在过去已经成功地实现了它。但是,我不确定如何在特定位置插入。例如,我有两个节点,想在它们之间插入一个值。由于链表中没有数字索引(我们使用链表的全部原因......),我该如何修复这段代码以便它可以在特定位置插入项目(这里的索引是一个描述性术语,不是数字索引):

def insert_element_at(self, val, index):
 new_node = Linked_List.__Node(val) 
 if index >= self.size or index < 0:
      raise IndexError
 elif self.size == 0:
     raise 'To add first value, please use append method.'
 else:
    self.current = self.header.next
    count = 0
    while count != index:
      self.current = self.current.next
      count += 1
    self.current.next = new_node
    new_node.next = self.current.next.next
    new_node.prev = self.current
    self.size += 1

在这种情况下,我使用 'count' 作为跟踪每次迭代位置的方法。这似乎不起作用,有没有人对我如何改进这段代码有任何想法?我认为我 运行 遇到的主要问题是当它遇到我的字符串方法时:

def __str__(self):  
  if self.size == 0:
    return '[ ]'
  self.current = self.header.next
  s = '[ '
  while self.current is not self.trailer:
    s += str(self.current.val)
    s += ', '
    self.current = self.current.next
  s += ' ]'
  return s

任何关于我如何改进它的想法或帮助都会很棒!

我认为问题在于将新节点链接到现有节点的操作顺序。当您执行 self.current.next = new_node 作为第一步时,您将无法访问 self.current.next 的原始值(它应该成为新节点之后的节点)。

这是我的做法:

while count != index:
  self.current = self.current.next
  count += 1
new_node.prev = self.current
new_node.next = self.current.next
self.current.next.prev = new_node
self.current.next = new_node

虽然我没有在上面这样做,但我也建议您将 current 设为局部变量而不是 self 的属性,因为函数中的局部变量访问起来更快比全局变量或属性。