資料結構之連結串列
- 建立連結串列元素類
- 建立連結串列類
- 為連結串列類建立方法函式
1.建立連結串列元素類
連結串列是由一個個元素連結而成的。所以第一步,我們先建立一個連結串列元素類,來表示我們的連結串列上的元素。接著我們通過 __init__
方法給它定義兩個屬性,self.value
和self.next
。
class Element(object):
def __init__(self, value):
self.value = value
self.next = None
複製程式碼
2.建立連結串列類
一個連結串列在最初被建立的時候,它至少需要一個元素。
連結串列是由元素連結而成,它的第一個元素,我們稱它為頭部元素。所以我們在__init__
方法裡給連結串列類定義了一個屬性,self.head = head
class LinkedList(object):
def __init__(self, head=None):
self.head = head
複製程式碼
3.為連結串列類建立函式方法
我們將為連結串列類建立以上四個方法。
append方法
在連結串列的後面增加一個元素。連結串列中不能像列表那樣通過索引定位每個元素。所以需要不斷呼叫 連結串列元素的.next
方法來不斷獲取下一個元素,最後獲取到最後一個元素。然後在最後一個元 素的.next
屬性裡指向新增的元素。
def append(self, new_element):
current = self.head
if self.head:
while current.next:
current = current.next
current.next = new_element
else:
self.head = new_element
複製程式碼
get_position方法
獲取連結串列中與傳入引數對應的元素位置。例:get_position(1) 將會獲取連結串列中第一個元素。
這裡我們依然需要通過迴圈呼叫.next
屬性來遍歷連結串列。不同的是我們需要定義一個變數counter
來記錄我們遍歷的連結串列元素順序。我們還需要在傳入的引數獲取不到連結串列元素時返回None
def get_position(self, position):
counter = 1
current = self.head
if position < 1:
return None
While current and counter <= position:
if counter == position:
return current
current = current.next
counter += 1
return None
複製程式碼
insert方法
insert
方法有兩個引數,new_element
和position
,new_element
表示要插入的元素,position
表示要插入連結串列的位置。
同樣的我們需要使用迴圈,也需要counter
來記錄我們遍歷連結串列的順序。通常我們插入元素時,都是從連結串列的中間插入。所以先不考慮把元素插入連結串列頭部的情況。現在我們來想象一下,假設我們想把元素new_element
插入到連結串列中第三個位置,也就是position
為3的時候,我們需要獲取什麼? 我們實際只需要獲取到它的前一個元素(我們假設這個元素為element2),也就是position
為2的元素,然後把element2.next
賦值給new_element.next
,然後再把new_element
賦值給element2.next
。於是,我們便完成了元素的插入,最後再考慮插入頭部的情況,我們直接把self.head
賦值給new_element.next
。
def insert(self, new_element, position):
counter = 1
current = self.head
if position > 1:
while current and counter < position:
if counter == position - 1
new_element.next = current.next
current.next = new_element
current = current.next
counter += 1
elif position == 1:
new_element.next = self.head
self.head = new_element
複製程式碼
delete方法
delete刪除一個value
屬性與傳入引數“value”相同的元素。
在連結串列中,要刪除一個元素,只需要,把被刪除元素前面一個元素指向到被刪除元素的後一個元素。這裡我們用previous來表示被刪除元素的前一個元素。
def delete(self, value):
current = self.head
previous = None
while current.value != value and current.next:
previous = current
current = current.next
if current.value == value:
if previous:
previous.next = current.next
else:
self.head = current.next
複製程式碼
一個完整的示例
class Element(object):
def __init__(self, value):
self.value = value
self.next = None
class LinkedList(object):
def __init__(self, head=None):
self.head = head
def append(self, new_element):
current = self.head
if self.head:
while current.next:
current = current.next
current.next = new_element
else:
self.head = new_element
def get_position(self, position):
counter = 1
current = self.head
if position < 1:
return None
while current and counter <= position:
if counter == position:
return current
current = current.next
counter += 1
return None
def insert(self, new_element, position):
counter = 1
current = self.head
if position > 1:
while current and counter < position:
if counter == position - 1:
new_element.next = current.next
current.next = new_element
current = current.next
counter += 1
elif position == 1:
new_element.next = self.head
self.head = new_element
def delete(self, value):
current = self.head
previous = None
while current.value != value and current.next:
previous = current
current = current.next
if current.value == value:
if previous:
previous.next = current.next
else:
self.head = current.next
複製程式碼