Python中循环链表的帮助

2024-05-19 08:58:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着做一个循环的单链表。我想能够修改我的代码为一个单独喜欢的名单,但我有一些麻烦。

对于我的链接列表,我有:

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

到目前为止,对于我的循环列表,我有:

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)

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


Tags: selfnonedatareturnifobjectdeflink
3条回答

last.next=创建时的第一个?

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

可能不是有效代码。但既然你在创建时肯定是在列表的最后一部分,那么你也可以。

循环链表的要点是跳过所有“if next is not None”逻辑。开始时,头部指向自身,表示列表为空。不需要创建空的“first”-在开始时:

self.head = Link(None, None)
self.head.next = self.head

然后要在其他节点之后插入节点,只需执行以下操作:

def insert_after(insert_node, after_node):
    insert_node.next = after_node.next
    after_node.next = insert_node

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

insert_after(node, head)

Insert before需要迭代以查找“before”节点,因为该列表仅单独链接:

def insert_before(node, before_node):
    loc = head
    while loc.next is not before_node:
        loc = loc.next
    insert_after(insert_node, loc)

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

insert_before(node, head)

要获取列表中的所有元素,请执行以下操作:

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

    # advance to next element
    current = current.next

但循环列表的真正功能是使它具有双重链接,因此您可以在插入之前不进行迭代。

class cirlist(list):
    def __init__(self,*arg):
        super(cirlist,self).__init__(*arg)
        self.m=super(cirlist,self).__getitem__(0)
        self.Index=0
    def next(self):
        if self.Index>=super(cirlist,self).__len__()-1:
            self.m=super(cirlist,self).__getitem__(0)
        else:
            self.m=super(cirlist,self).__getitem__(self.Index+1)
        if self.Index>super(cirlist,self).__len__()-1:    
            self.Index=super(cirlist,self).index(self.m)+1
        else:
            self.Index=super(cirlist,self).index(self.m)
        return self.m

相关问题 更多 >

    热门问题