Python 連結串列實踐

餘漪發表於2019-04-01

資料結構之連結串列

  1. 建立連結串列元素類
  2. 建立連結串列類
  3. 為連結串列類建立方法函式

1.建立連結串列元素類

連結串列是由一個個元素連結而成的。所以第一步,我們先建立一個連結串列元素類,來表示我們的連結串列上的元素。接著我們通過 __init__ 方法給它定義兩個屬性,self.valueself.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_elementpositionnew_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
複製程式碼

相關文章