簡體   English   中英

從單鏈表到雙鏈表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM