python實現單向連結串列
阿新 • • 發佈:2019-01-29
在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,連結串列只有頭結點而已。
其實只要理解了,就是這麼簡單。