Python 鏈表實踐

數據結構之鏈表

  1. 建立鏈表元素類
  2. 建立鏈表類
  3. 爲鏈表類建立方法函數

1.建立鏈表元素類

鏈表是由一個個元素連接而成的。因此第一步,咱們先建立一個鏈表元素類,來表示咱們的鏈表上的元素。接着咱們經過 __init__ 方法給它定義兩個屬性,self.valueself.nextpython

class Element(object):
    def __init__(self, value):
        self.value = value
        self.next = None
複製代碼

2.建立鏈表類

一個鏈表在最初被建立的時候,它至少須要一個元素。bash

鏈表是由元素連接而成,它的第一個元素,咱們稱它爲頭部元素。因此咱們在__init__方法裏給鏈表類定義了一個屬性,self.head = head數據結構

class LinkedList(object):
	def __init__(self, head=None):
		self.head = head
複製代碼

3.爲鏈表類建立函數方法

咱們將爲鏈表類建立以上四個方法。app


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) 將會獲取鏈表中第一個元素。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方法

insert方法有兩個參數,new_elementpositionnew_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方法

​ 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
複製代碼
相關文章
相關標籤/搜索