帮助Python中的循环链接列表

chr*_*nze 2 python linked-list circular-list

我正在尝试制作一个循环的单链表.我希望能够修改我的代码以获得一个单独喜欢的列表但我遇到了一些麻烦.

对于我的链表,我有:

class Link (object):
  def __init__ (self, data, next = None):
    self.data = data
    self.next = next


class LinkedList(object):
  def __init__(self):
    self.first = None

  def __str__(self):
    a = "["
    current = self.first
    while current != None:
      a += str(current.data) + ', ' 
      current = current.next
    a = a[:-2] + ']'  
    return a  

  def __iter__(self):
    current = self.first
    a = []
    while current != None:
      a += [current.data]
      current = current.next
    return iter(a)

  def __len__ (self):
    current = self.first
    a = []
    while current != None:
      a += [current.data]
      current = current.next
    return len(a)

  def InsertFirst(self, item):
    NewLink = Link(item, self.first)
    self.first = NewLink

  def InsertLast(self, item):
    NewLink = Link(item)
    current = self.first

    if current == None:
      self.first = NewLink  
      return 

    while current.next != None:
      current = current.next
    current.next = NewLink 

  def Search(self, item):
    count = 0
    current = self.first
    while current != None:
      count += 1
      if current.data == item:
        return count
      else:
        pass
        current = current.next
    return -1

  def Delete(self, item):
    current = self.first
    previous = self.first

    if (current == None):
      return None

    while (current.data != item):
      if (current.next == None):
        return None
      else:
        previous = current
        current = current.next

    if (current == self.first):
      self.first = self.first.next
    else:
      previous.next = current.next

    return current
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的圆形清单中有:

class Link (object):
  def __init__ (self, data, next = None):
    self.data = data
    self.next = next


class CircularList(object):
  def __init__(self):
    self.first = Link(None, None)
    self.head = Link(None, self.first)

  def __str__(self):
    a = "["
    current = self.first
    while current != None:
      a += str(current.data) + ', ' 
      current = current.next
    a = a[:-2] + ']'  
    return a  

  def InsertLast(self, item):
    NewLink = Link(item)
    current = self.first

    if current == None:
      self.first = NewLink  
      return 

    while current.next != None:
      current = current.next
    current.next = Link(item)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何将最后一个元素链接回第一个元素以便我可以横向移动?

Pau*_*McG 7

循环链表的要点是跳过所有"if next is not None"逻辑.在开头,头指向自己,表明列表是空的.没有必要创建一个空的"第一" - 在一开始就做:

self.head = Link(None, None)
self.head.next = self.head
Run Code Online (Sandbox Code Playgroud)

然后在其他节点之后插入一个节点,你只需:

def insert_after(insert_node, after_node):
    insert_node.next = after_node.next
    after_node.next = insert_node
Run Code Online (Sandbox Code Playgroud)

要在列表的开头插入,请执行以下操作:

insert_after(node, head)
Run Code Online (Sandbox Code Playgroud)

之前插入需要迭代才能找到"之前"节点,因为列表只是单链接:

def insert_before(node, before_node):
    loc = head
    while loc.next is not before_node:
        loc = loc.next
    insert_after(insert_node, loc)
Run Code Online (Sandbox Code Playgroud)

要在列表末尾插入,请执行以下操作:

insert_before(node, head)
Run Code Online (Sandbox Code Playgroud)

获取列表的所有元素:

current = self.head.next
while current is not self.head:
    # do something with current.data

    # advance to next element
    current = current.next
Run Code Online (Sandbox Code Playgroud)

但循环列表中的实际功能是使其双重链接,因此您可以在不进行迭代之前插入.