双向链表的排序列表

时间:2015-06-19 01:50:59

标签: python list sorting doubly-linked-list

我有以下2个类节点和双重链接列表

class DLLNode(object):
  def __Init__ (self, data, prev_node=None, next_node=None):
    self.data=data
    self.prev_node=prev_node
    self.next_node=next_node

  def __str__(self):
    return str(self.data)

class DoublyLinkedList(object):
  def __init__(self, head=None, tail=None):
    self.head=head
    self.tail=tail
    self.size=0

  def add_to_head(self, data):
    newNode = DLLNode(data)
    if self.head==None:
      self.head=self.tail=newNode
      self.head.prev_node=self.tail.next_node=None
    else:
      self.head.prev_node=newNode
      newNode.next_node=self.head
      self.head=newNode

  def add_to_tail(self, data):
    newNode=DLLNode(data)
    if self.head==None:
      self.head=self.tail=newNode
      self.head.prev_node=self.tail.next_node=None
    else:
      self.tail.next_node=newNode
      newNode.prev_node=self.tail
      self.tail=newNode
      self.tail.next_node=None

  def remove_head(self):
    node=self.head
    if self.head==self.tail:
      self.prev_node=self.next_node=self.head=self.tail=None
      return
    if self.head!=self.tail:
      node=node.next_node
      node.prev_node=None
      self.head=node

  def remove_tail(self):
    node=self.tail
    if self.head==self.tail:
      self.prev_node=self.next_node=self.head=self.tail=None
      return
    if self.head!=self.tail:
      self.tail=node.prev_node
      self.tail.next_node=None


  def index(self,element):
    current = self.head
    while current != None:
      if current.data == element:
      return current.position
    else:
      current = current.next
      return -1

我想创建一个名为SortedList的第三个类,它是DoublyLinkedList类的子类。该类应该添加和删除哪个添加和删除对象到列表,并保持列表排序。一个中间的'返回列表中间元素的方法。不知道我应该如何创建这个类,有点困惑。

1 个答案:

答案 0 :(得分:0)

如果希望列表保持排序,请确保以排序位置插入元素。找到这个位置应该很简单。

双向链表类只有一个双端队列(dequeue)接口,因此使用当前方法实际上无法插入,您需要自己编写。

此外,扩展双向链表没有那么大意义,因为add_to_head和add_to_tail方法对于排序列表不是有效操作,排序列表应该只允许单个“插入”(可能称为“添加”,名称是不重要的)可能会把东西放在头部或尾部,但可以把它放在任何地方。因此,您可能需要考虑不同的继承层次结构。

最后,为了跟踪中间元素,您需要确定中间值在偶数长度列表的上下文中的含义,然后在您:

  • 在列表中间插入一些内容,您可能需要将中间值更改为其前一个
  • 在列表中间插入一些内容,您可能需要将中间值更改为其后继者
  • 删除列表中间的内容,您可能需要将中间位置改为后继
  • 删除列表中间的内容后,您可能需要将中间值更改为其前一个
  • 删除列表的中间位置,您需要将中间位置设置为其前任或后续位置

您需要如何处理这些情况将取决于您如何定义偶数长度列表的中间以及列表是否更改为偶数或奇数长度。请务必仔细考虑每个案例,以使其正确无误。