1. 程式人生 > >python實現單向連結串列

python實現單向連結串列

在C語言中,用指標來實現單向連結串列非常簡單。而python是不存在指標這種結構的,但我們也可以實現連結串列資料結構,使用類和物件的引用即可達到C語言中的指標的效果。
這裡寫圖片描述
圖片來自於網路

圖中我們可以看到,單向連結串列的每一個節點會包含兩項資料,當前節點的元素,以及對下一個節點的引用(C語言中就是指標)。並且最後一個元素的引用為None(C語言中就是NULL).

下面我們定義節點物件

class Node(object):
    def __init__(self, value):
        self.value = value
        self.next = None

通過例項化這個Node類,我們就可以生成一個節點,並且每個節點會包含一個元素value,以及next(指向下一個節點)預設為None.

下面實現我們的單向連結串列

class Link(object):
    def __init__(self):
        """
        初始化一個頭節點,並賦予為head
        """
        self.first = Node('head')

    def add(self, value):
        """
        新增一個節點
        """
        p = self.first
        newnode = Node(value)
        while
p.next: p = p.next else: p.next = newnode def remove(self, value): """ 移除值為value的節點 如果有重複的值,只會移除第一次出現的節點 預設認為value一定在連結串列中 """ p = self.first while p.next: temp = p.next if temp.value == value: p.next = temp.next del
temp break else: p = p.next def insert(self, value, index): """ 在指定的位置插入一個節點 index必須大於等於1 如果為0的話,我們定義的頭結點就沒意義了 如果插入的位置大於當前連結串列的長度,就插入到連結串列的末尾 """ i = 0 p = self.first newnode = Node(value) while p.next: i += 1 if i == index: p.next, newnode.next = newnode, p.next break p = p.next else: p.next = newnode def index(self, index): """ 返回index索引位置上的節點的值 """ length = self.length() if index > length: raise IndexError, 'out of the length!' else: i = 0 p = self.first while 1: if i == index: return p.value break else: p = p.next i += 1 def find(self, value): """ 返回節點第一次出現的位置 如果沒有找到,就返回-1 """ p = self.first i = 0 while p.next: if p.value == value: return i break else: p = p.next i += 1 else: return -1 def length(self): """ 判斷當前連結串列的長度 """ p = self.first i = 0 while p.next: i += 1 p = p.next else: return i def to_dict(self): """ 以字典的形式輸出我們的連結串列 """ p = self.first d = {'value': p.value, 'next': p.next} b = d while p.next: p = p.next new = {'value': p.value, 'next': p.next} b['next'] = new b = b['next'] else: return d

在這個單向連結串列中,我們實現了add(value),find(value), insert(value, index), remove(value), index(value), length(), to_dict()這七個方法。我沒有定義判斷連結串列是否為空的方法,是因為在初始化連結串列的時候我會賦予一個頭結點,這個節點我是算在連結串列的長度中的。所以,如果要檢視連結串列是否為空,呼叫length()方法即可,返回為1,連結串列只有頭結點而已。

其實只要理解了,就是這麼簡單。