數據結構一:python實現簡單的單向鏈表

參照python基本數據類型list實現部分功能 :

#!/usr/bin/env python
# -*- coding: utf-8 -*-


class BaseNode(object):
    """
    結點
    """
    def __init__(self, item):
        # 結點的值
        self.item = item
        # 下一個結點
        self.next = None
class SingleLinkedList(object):
    """
    單項鍊表
    保存一個鏈表只需要保存它的頭結點即可
    """

    def __init__(self, node=None):
        # 頭結點
        self.head = node

    def is_empty(self):
        """
        判斷鏈表好似否爲空
        :return: bool
        """
        return self.head is None

    def length(self):
        """
        鏈表的長度
        :return: 鏈表的結點個數
        """
        # 用於記錄鏈表的結點個數
        length = 0
        # 獲取頭結點
        node = self.head
        # 如果當前結點不是None
        while node:
            # 結點個數加1
            length += 1
            # 將當前結點指定到下個結點
            node = node.next
        # 返回結點個數
        return length

    def __str__(self):
        """
        打印實例時的輸出
        :return:
        """
        # 獲取頭結點
        node = self.head
        travel = "["
        while node:
            if node == self.head:
                travel += str(node.item)
            else:
                travel += ", %r" % node.item
            node = node.next
        return travel + "]"

    def search(self, item):
        """
        查詢值是否在鏈表中
        :param item: 要查詢的值
        :return: bool
        """
        # 獲取頭結點
        node = self.head
        # 如果當前結點不爲None
        while node:
            # 如果當期按結點的值等於要查詢的值
            if node.item == item:
                # 返回True
                return True
            node = node.next
        else:
            # 如果所有結點的值都不等於要查詢的值  返回False
            return False

    def add(self, item):
        """
        從頭部添加一個結點
        item: 將要添加的結點的值
        :return: None
        """
        # 創建結點
        new_node = BaseNode(item)
        # 把將要添加的結點的下一個結點指向鏈表的頭結點,並將鏈表的頭結點指向將要添加的結點
        new_node.next, self.head = self.head, new_node

    def append(self, item):
        """
        從尾部添加一個結點
        :param item: 將要添加的結點的值
        :return: None
        """
        # 創建新結點
        new_node = BaseNode(item)
        # 如果鏈表爲空
        if self.head is None:
            # 則將鏈表的頭結點指向新結點
            self.head = new_node
        else:
            # 獲取頭結點
            node = self.head
            # 如果當前結點不爲None
            while node.next:
                # 將當前結點指向下一個結點
                node = node.next
            # 將當前結點的下一個結點指向新結點
            node.next = new_node

    def insert(self, site, item):
        """
        插入數據
        :param site: 插入的位置
        :param item: 插入的值
        :return:
        """
        # 判斷位置參數是否是int類型
        if not isinstance(site, int):
            raise TypeError("site must be integers")
        # 如果要插入的位置小於等於0
        if site <= 0:
            # 從頭部添加
            self.add(item)
        # 如果要插入的位置大於或等於鏈表的最大長度
        elif site >= self.length():
            # 從尾部添加
            self.append(item)
        else:
            # 創建新結點
            new_node = BaseNode(item)
            # 獲取頭結點
            node = self.head
            # 獲取要插入的上一個結點
            for i in range(site - 1):
                node = node.next
            # 將新的結點的下一個結點指向當前結點的下一個結點 並把當前結點的下一個結點指向新結點
            new_node.next, node.next =  node.next, new_node

    def clear(self):
        """
        清空鏈表
        :return:
        """
        self.head = None

    def __getitem__(self, site):
        """根據索引取出對應的值"""
        # 判斷位置參數是否是int類型
        if not isinstance(site, int):
            raise TypeError("site must be integers")
        if self.length() <= site:
            raise IndexError('Out of range')
        node = self.head
        for i in range(site):
            node = node.next
        return node.item

    def __setitem__(self, site, item):
        """
        設置結點的值
        :param site: 結點位置
        :param item: 要修改值
        :return:
        """
        # 判斷位置參數是否是int類型
        if not isinstance(site, int):
            raise TypeError("site must be integers")
        if self.length() <= site:
            raise IndexError('Out of range')
        node = self.head
        for i in range(site):
            node = node.next
        node.item = item

    def remove(self, item):
        """
        根據值刪除結點
        :param item: 要刪除的值
        :return:
        """
        if self.head:
            # 獲取頭結點
            node = self.head
            # 如果頭結點是要刪除的結點
            if node.item == item:
                # 將頭結點指向當前頭結點的下一個結點
                self.head = node.next
                # 返回
                return
            # 如果當前結點有下一個結點
            while node.next:
                # 如果當前結點的下一個結點是要刪除的節點
                if node.next.item == item:
                    # 將當前結點的下一個結點指向當前結點的下下個節點
                    node.next = node.next.next
                    # 返回
                    return
                # 將當前結點指向下一個結點
                node = node.next
        # 如果以上條件都不滿足 則說明值不在鏈表內
        raise ValueError('item not in SingleLinkedList')

順序表和鏈表的區別參考:https://blog.csdn.net/Y1730008223CONG/article/details/68958022

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章