从单链表到双链表

时间:2014-04-06 21:54:36

标签: python list loops linked-list iteration

如何编写像'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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在常规的双向链表中,您要向Node类添加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