python---链表的常用操作

"""
链表是一种无序的列表,每个元素是Node结点,每个Node会保存结点值value和下一个节点的引用next
"""


class Node:
    """
    定义结点对象
    """

    def __init__(self, data):
        self.data = data  # 当前结点的值
        self.next = None  # 下一个节点的引用

    # 获取node里面的数据
    def get_data(self):
        return self.data

    # 获取下一个结点的引用
    def get_next(self):
        return self.next

    # 设置node里面的数据
    def set_data(self, new_data):
        self.data = new_data

    # 设置下一个结点的引用
    def set_next(self, new_next):
        self.next = new_next


class SingleLinkList:
    """
    定义链表, 定义一个head属性, 链表头.
    链表本身是不包含任何结点Node的, 只包含链式结构中对第一个结点的引用
    链表和结点在定义上是独立的, 互相不包含对方.
    """

    def __init__(self):
        self.head = None  # head为None表示空链表

    # 判断链表是否为空
    def is_empty(self):
        return self.head is None

    # 获取链表的长度
    def get_size(self):
        current_node = self.head  # 从表头开始对结点计数
        size = 0
        while current_node is not None:  # 结点的next指向None,遍历完成
            size += 1
            current_node = current_node.get_next()
        return size

    # 向链表中增加一个结点
    # 链表结构始终只保持对第一个结点的引用, 故增加结点最简单的方法是将增加的新结点作为表头
    def add_node(self, val):
        temp = Node(val)
        temp.next = self.head  # 将要增加结点的下一个节点指向原来的表头
        self.head = temp  # 将新表头设置为增加的结点

    # 查找指定结点是否在结点中
    # 遍历链表, 设置一个布尔值作为是否查找到目标元素的标志
    def search_node(self, item):
        current_node = self.head  # 从头结点开始遍历
        is_found = False  # 是否找到标志
        while current_node is not None and not is_found:  # 链表没遍历完,而且还没找到
            if current_node.get_data() == item:
                is_found = True
            else:
                current_node = current_node.get_next()

        return is_found

    # 移除指定结点
    def remove_node(self, item):
        current_node = self.head  # 当前结点,头结点
        previous_node = None  # 当前结点的上一个结点
        is_found = False  # 是否存在的标志

        # 如果结点不在链表中,直接return
        if not self.search_node(item):
            return

        # 如果结点在链表中, 停止遍历
        while not is_found:
            if current_node.get_data() == item:
                is_found = True
            else:
                previous_node = current_node
                current_node = current_node.get_next()

        # 被删除的结点是表头时
        if previous_node is None:
            self.head = current_node.get_next()
        else:
            previous_node.set_next(current_node.get_next())

    # 获取所有结点的值
    def get_all_nodes(self):
        all_nodes = []  # 存放所有结点的列表
        current_node = self.head  # 从表头开始循环遍历链表
        while current_node is not None:
            all_nodes.append(current_node.get_data())
            current_node = current_node.get_next()

        return all_nodes


if __name__ == '__main__':
    singleLinkList = SingleLinkList()
    for i in range(10, 50, 5):
        singleLinkList.add_node(i)
    print(singleLinkList.get_all_nodes())  # [45, 40, 35, 30, 25, 20, 15, 10]
    print(singleLinkList.get_size())  # 8

    singleLinkList.remove_node(35)
    print(singleLinkList.get_all_nodes())  # [45, 40, 30, 25, 20, 15, 10]

    print(singleLinkList.search_node(20))  # True
    print(singleLinkList.search_node(22))  # False
    print(singleLinkList.is_empty())  # False

    singleLinkList.add_node(86)
    print(singleLinkList.get_all_nodes())  # [86, 45, 40, 30, 25, 20, 15, 10]

猜你喜欢

转载自www.cnblogs.com/KX-Lau/p/12464854.html