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