[英]From single linked list to double linked list
如何編寫像“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
您將需要在每個列表項( 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
在常規雙向鏈表中,您將向 Node 類添加一個prev
屬性(指向前一個節點)並添加一個 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.