鏈表是由一個個元素連接而成的。因此第一步,咱們先建立一個鏈表元素類,來表示咱們的鏈表上的元素。接着咱們經過 __init__
方法給它定義兩個屬性,self.value
和self.next
。python
class Element(object):
def __init__(self, value):
self.value = value
self.next = None
複製代碼
一個鏈表在最初被建立的時候,它至少須要一個元素。bash
鏈表是由元素連接而成,它的第一個元素,咱們稱它爲頭部元素。因此咱們在__init__
方法裏給鏈表類定義了一個屬性,self.head = head
數據結構
class LinkedList(object):
def __init__(self, head=None):
self.head = head
複製代碼
咱們將爲鏈表類建立以上四個方法。app
在鏈表的後面增長一個元素。鏈表中不能像列表那樣經過索引定位每一個元素。因此須要不斷調用 鏈表元素的.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(1) 將會獲取鏈表中第一個元素。ui
這裏咱們依然須要經過循環調用.next
屬性來遍歷鏈表。不一樣的是咱們須要定義一個變量counter
來記錄咱們遍歷的鏈表元素順序。咱們還須要在傳入的參數獲取不到鏈表元素時返回Nonespa
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
方法有兩個參數,new_element
和position
,new_element
表示要插入的元素,position
表示要插入鏈表的位置。code
一樣的咱們須要使用循環,也須要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刪除一個value
屬性與傳入參數「value」相同的元素。element
在鏈表中,要刪除一個元素,只須要,把被刪除元素前面一個元素指向到被刪除元素的後一個元素。這裏咱們用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
複製代碼