python鏈表之單向鏈表實踐

python鏈表之單向鏈表實踐

鏈表是一種常見的數據結構,屬於線性表的一種,但不會按照線性的順序存儲數據。

由於不按照順序存儲,鏈表在存儲的時候是O(1)的複雜度。

鏈表包含:單向鏈表、雙向鏈表、循環鏈表、塊狀鏈表

本文主要是單向鏈表的實踐,也是鏈表中最簡單的一種,它包含了兩個域,一個用於數據存儲,一個指向下一個節點,而最後一個節點指向None。

單向鏈表只可以往一個方向遍歷,這也是名字的由來。

實踐代碼:

# -*- encoding: utf-8 -*-
"""
@File    : singleLinkedList
@Author  : TopAbu.com
@Software: IntelliJ IDEA
"""
# 1.定義節點類:item、next
# 2.定義單向鏈表類:定義一個屬性保存頭節點(需要根據頭節點獲取後續所有節點)


class Node(object):
    name = '節點類'

    def __init__(self, item):
        self.item = item
        self.next = None

    def __repr__(self):
        return str(self.item)


class SingleLinkedList(object):
    name = '單向鏈表'

    def __init__(self):
        self.__head = None

    def is_empty(self):
        '''判斷是否爲空'''
        return self.__head is None

    def length(self):
        '''返回鏈表的長度'''
        cur = self.__head
        count = 0
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        '''打印鏈表中的每一個元素'''
        cur = self.__head
        while cur is not None:
            print(cur.item)
            cur = cur.next

    def search(self, item):
        '''查找某一元素是否在鏈表中'''
        cur = self.__head
        while cur is not None:
            if cur.item == item:
                return True
            cur = cur.next
        return False

    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
        cur = self.__head
        while cur.next is not None:
            cur = cur.next
        cur.next = node

    def insert(self, item, pos):
        '''
        在指定位置添加元素
        item -> 元素
        pos -> 插入位置
        '''
        if pos <= 0:
            self.add(item)
        elif pos > (self.length() - 1):
            self.append(item)
        else:
            count = 0
            cur = self.__head
            node = Node(item)
            while count < (pos - 1):
                cur = cur.next
                count += 1
            node.next = cur.next
            cur.next = node

    def remove(self, item):
        '''刪除節點,默認刪除一個元素'''
        cur = self.__head
        pre = None
        while cur is not None:
            if cur.item == item:
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    pre.next = cur.next
                return
            pre = cur
            cur = cur.next


if __name__ == '__main__':
    ll = SingleLinkedList()
    print(ll.is_empty())
    print(ll.length())
    ll.add(1)
    print(ll.search(1))
    ll.append('a')
    ll.add('b')
    ll.insert('p', 2)
    print('*'*20)
    ll.travel()
    print('*'*20)
    ll.remove('p')
    ll.travel()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章