【问题标题】:From single linked list to double linked list从单链表到双链表
【发布时间】:2014-04-06 21:54:36
【问题描述】:

如何编写像“next(lst)”这样返回 PREVIOUS 值而不是 NEXT 值的函数?

class EmptyNode():
    __slots__ = ()

class Node():
    __slots__ = ('data', 'next')


class MyList():
"""A class that encapsulates a node based linked list"""
    __slots__ = ('head', 'size', 'cursor')

def mkEmptyNode():
    return EmptyNode()

def mkNode(data, next):
    node = Node()
    node.data = data
    node.next = next
    return node

def mkMyList():
    lst = MyList()
    lst.head = mkEmptyNode()
    lst.size = 0
    lst.cursor = mkEmptyNode()
    return lst

在类似['a','b','c']的链表中,next(lst)会返回'a',下一次会返回'b',下一次会返回'c',下一次会返回一个错误

def next(lst):
    if isinstance(lst.cursor, EmptyNode):
        raise IndexError("cursor is invalid")

    val = lst.cursor.data
    lst.cursor = lst.cursor.next
    return val

【问题讨论】:

  • 什么时候创建非空节点?因为您的 mkMyList 只是创建空节点(没有 next 属性)

标签: python list loops linked-list iteration


【解决方案1】:

您需要在每个列表项中维护一个额外的指针 (previous)。

class EmptyNode():
  __slots__ = ()

class Node():
  __slots__ = ('data', 'next', 'prev')

class MyList():
  """A class that encapsulates a node based linked list"""
  __slots__ = ('head', 'size', 'cursor')

def mkEmptyNode():
  return EmptyNode()

def mkNode(prev, data, next):
  node = Node()
  node.prev = prev
  node.data = data
  node.next = next
  return node

def mkMyList():
  lst = MyList()
  lst.head = mkEmptyNode()
  lst.size = 0
  lst.cursor = mkEmptyNode()
  return lst

然后您可以使用它来向后导航列表:

def previous(lst):
  if isinstance(lst.cursor, EmptyNode):
    raise IndexError("cursor is invalid")

  val = lst.cursor.data
  lst.cursor = lst.cursor.prev
  return val

【讨论】:

    【解决方案2】:

    在常规的双向链表中,您需要向 Node 类添加一个 prev 属性(指向 previous 节点)并添加一个 prev 方法,该方法执行以下操作:

    class Node():
        __slots__ = ('data', 'next', 'prev')
    

    然后:

    def prev(lst):
        if isinstance(lst.cursor, EmptyNode):
            raise IndexError("cursor is invalid")
    
        val = lst.cursor.data
        lst.cursor = lst.cursor.prev
        return val
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2012-03-21
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多