博客 / 詳情

返回

Python 中鏈表的個人理解

鏈表組成

Python 中鏈表由 head節點tail、 三部分組成。

  • 節點為Python 鏈表中最重要的部分,通過構建class Node()類,節點引入並存儲value和next變量,其中value為Node中存儲的鏈表內容,next為Node中存儲的指針,指向下一個Node。即Node由指針域next和結構域value構成。
  • 鏈表由上述Node連結而成,其中head指向鏈表的第一個節點,tail指向鏈表最後一個節點。
  • tail指向的尾端Node的next指向(存儲)None,即該Node的指針域存儲 None的內存地址

示例代碼:

class Node():
    def __init__(self, context=None, next=None):
        self._context = context  # 提高代碼的健壯性  類似Java 的處理 需要定義函數獲取參數數據
        self._next = next

    def getContext(self):
        return self._context

    def getNext(self):
        return self._next

    def setContext(self, newContext):
        self._context = newContext

    def setNext(self, newNext):
        self._next = newNext


class LinkedList():
    def __init__(self):
        self._head = None
        self._tail = None
        self._length = 0

    def isempty(self):
        return self._head is None

    def add(self, newadding):
        newNode = Node()
        newNode.setContext(newadding)
        newNode.setNext(self._head)
        self._head = newNode
        if self._tail is None:
            self._tail = newNode
        self._length += 1

    def append(self, newAppending):
        newANode = Node()
        newANode.setContext(newAppending)
        if self._head is None:
            self._tail = newANode
            self._head = newANode
        else:
            self._tail.setNext(newANode)
            self._tail = newANode
        self._length += 1

    def remove(self, context):
        previous = None
        current = self._head
        while current is not None:
            if current.getContext() == context:
                if not previous:
                    self._head = current.getNext()
                else:
                    previous.setNext(current.getNext())
                break
            else:
                previous = current
                current = current.getNext()

    def search(self, context):
        current = self._head
        result = False
        while current is not None and not result:
            if current.getContext() == context:
                result = True
            else:
                current = current.getNext()
        return result

    def items(self):
        cur = self._head
        while cur is not None:
            yield cur.getContext()
            cur = cur.getNext()

    @property
    def tail(self):
        return self._tail


if __name__ == '__main__':
    LL = LinkedList()
    print(LL.isempty())
    LL.add(1)
    LL.add(2)
    print(LL._tail.getContext())
    print(LL)
    for i in LL.items():
        print(i)
    print(LL.search(2))
    LL.append(3)
    for i in LL.items():
        print(i)
    LL.remove(1)
    for i in LL.items():
        print(i)
    print(LL.search(1))
    print(LL._tail.getContext())

上述示例運行結果如下:

True
1
<__main__.LinkedList object at 0x000002157A80BFD0>
2
1
True
2
1
3
2
3
False
3
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.