用 Python 實現單向連結串列
阿新 • • 發佈:2019-02-11
寫在前面
最近在看資料結構,看過才發現,只有這些東西才能讓我更加深刻的理解 python 中的資料型別。其實不管語言怎麼變化,資料結構和演算法是恆古不變的,這些東西學會,學一些別的語言會很快的。
我可能太菜了,一個連結串列看了好幾遍,手動捂臉,。
什麼是 連結串列
連結串列顧名思義就是~鏈
連結串列是一種動態資料結構,他的特點是用一組任意的儲存單元存放資料元素。連結串列中每一個元素成為“結點”,每一個結點都是由資料域和指標域組成的。跟陣列不同連結串列不用預先定義大小,而且硬體支援的話可以無限擴充套件。
用 python 的程式碼來實現
實現連結串列,本質上和語言是無關的。但是靈活度卻和實現它的語言密切相關。
用 python 實現起來相對起來簡單一點。
定義一個節點:
# 單鏈表的節點由資料域和指標域兩部分組成,通俗講就是一個存資料一個存下一個資料的地址。
class Node(object):
'''節點'''
def __init__(self,element):
# 儲存節點的資料
self.element = element
# 下一個節點的地址,因為現在還沒有建立連結串列,下一個節點指向還不確定,所以下一個節點的地址暫為空
self.next = None
節點建立完成之後,建立一個單向連結串列。
class SingleLinkList(object):
'''實現單鏈表,把節點串聯起來'''
# 這裡實現一個物件的屬性,目的是把節點掛到連結串列的開始位置,後續節點就不會迷路啦
# 一開始節點預設為空
def __init__(self,node=None):
self.__head = node
def is_empty(self):
'''判斷連結串列是否為空'''
# 如果連結串列的頭部沒有節點,就為空
return self.__head == None
def length(self):
'''返回連結串列的長度'''
# 要想知道連結串列的長度,需要遍歷一遍連結串列,然後計數
# 定義一個遊標,指向第一個節點,通過遊標的移動,計算連結串列中元素的個數
cur = self.__head # 代表遊標跟第一個節點指向的是同一個位置
count = 0
while cur != None:
count += 1
cur = cur.next # 遊標移動
return count
def travel(self):
'''遍歷整個連結串列'''
cur = self.__head
while cur != None:
print(cur.element,end=' ')
cur = cur.next
def add(self,item):
'''在頭部新增元素'''
# 在頭部新增,把原來的頭部節點斷開
# 新的節點的地址指向原來節點的第一個位置,然後新的節點的元素設為頭部
node = Node(item)
node.next = self.__head
self.__head = node
def append(self,item):
'''連結串列尾部新增元素,尾插法'''
# 先構造這個節點
node = Node(item)
if self.is_empty():
self.__head = node
else:
cur = self.__head
# 這裡判斷條件發生變化,請注意
while cur.next != None:
cur = cur.next
cur.next = node
def insert(self,pos,item):
'''指定位置插入元素'''
# 如果輸入的位置元素小於零,在頭部插入
if pos <= 0:
self.add(item)
# 如果輸入的位置元素大於列表的長度,在尾部插入
elif pos > (self.length()-1):
self.append(item)
else:
node = Node(item)
pre = self.__head
count = 0
# 要對插入位置的前一個元素進行操作
while count < (pos - 1):
pre = pre.next
count += 1
# 當迴圈退出後,pre 指向 pos-1 的位置。
node.next = pre.next
pre.next = node
def remove(self,item):
'''刪除節點'''
cur = self.__head
pre = None
while cur != None:
if cur.element == item:
# 先判斷此節點是否是頭結點
if cur == self.__head:
self.__head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
def search(self,item):
'''查詢節點是否存在'''
cur = self.__head
while cur != None:
if cur.element == item:
return True
else:
cur = cur.next
return False
if __name__ == '__main__':
li = SingleLinkList()
print('是否為空',li.is_empty())
print('長度是否為0',li.length())
li.append(1)
print('是否為空',li.is_empty())
print('長度是否為0',li.length())
li.append(2)
li.add(9)
li.travel()
li.insert(1,10)
li.travel()