数据结构(线性表) - Python

文章介绍了链式存储的概念,它将逻辑上相邻的元素分散在不同的存储块中,每个结点(除尾结点外)包含一个指向下一个结点的引用。链表结构允许动态分配空间,提高了插入和删除操作的效率。提供了Node和LinkList两个Python类作为链表的节点和操作实现,包括头插法、尾插法、按索引插入、删除节点、获取和设置节点值以及判断链表是否为空的方法。
摘要由CSDN通过智能技术生成

线性结构的链式存储

定义: 将每个结点分布在存储器的不同存储块中,每个结点(尾结点除外)都持有一个指向下一结点的引用,所得到的存储结构为链表结构
如图所示
在这里插入图片描述
特点:

  1. 逻辑上相邻的元素,其存储位置不一定相邻
  2. 存储稀疏,不用开辟整块存储空间
  3. 对结点的插入删除等操作运算效率较高
  4. 逻辑结构复杂,不利于遍历

代码实现:

"""
自定义结点生成类 Node.py

"""
class Node:
    def __init__(self, value, ptr_next = None):
    """
        :param val: 结点自身数据
        :param ptr_next: 循环下一个结点
        """
    	self.value = value
    	self.ptr_next = ptr_next
"""
自定义链表类,对链表的增删改查操作 LinkList.py
"""
from Node import *
class LinkList:
	def __init__(self):
		"""
		创建一个头节点
		"""
		self.head = Node(None)

在这里插入图片描述


	def clear_link(self):
        """
        清空链表
        :return:
        """
        if self.head.ptr_next is not None:
            self.head.ptr_next = None

在这里插入图片描述

	def end_append(self, node):
        """
        在尾部新增一个结点 (尾插法)
        :param node: 结点
        :return:
        """
        p = self.head
        # 先遍历找到链表中最后一个结点
        while p.ptr_next is not None:
            p = p.ptr_next
        # 将最后一个结点的ptr_next指向新增加的结点
        p.ptr_next = node

在这里插入图片描述

	def head_append(self, node):
        """
        在链表的头部插入新结点(头插法)
        :param node: 结点
        :return:
        """
        node.ptr_next = self.head.ptr_next
        self.head.ptr_next = node

在这里插入图片描述

	 def index_append(self, index, node):
        """
        在指定位置插入结点
        :param index: 指定的位置
        :param node: 插入的结点
        :return:
        """
        p = self.head
        for item in range(index):
            if p.ptr_next is None:
                break
            p = p.ptr_next
        node.ptr_next = p.ptr_next
        p.ptr_next = node 

在这里插入图片描述

	def move_link(self, value):
        """
        删除结点
        :param value: 删除的对应元素的值
        :return:
        """
        p = self.head
        while p.ptr_next and p.ptr_next.value != value:  
            p = p.ptr_next
            # 删除的元素不在链表中异常
        if p.ptr_next is None:
            raise ValueError("value is not LinkList")
        else:
            p.ptr_next = p.ptr_next.ptr_next

在这里插入图片描述

	def get_value(self, index):
        """
        获取某个结点
        :param index: 需要获取的值的索引
        :return: 获取某个结点的值
        """
        if index < 0:
        	# 索引小于0异常
            raise ValueError("value is not LinkList")
        p = self.head.ptr_next
        for i in range(index):
            if p.ptr_next is None:
            	# 要获取的结点不在链表中异常
                raise IndexError("LinkList index out of range")
            p = p.ptr_next
        return p.value

在这里插入图片描述

	def set_index_link(self, index, new_value):
        """
        修改结点
        :param index: 需要修改的结点的索引
        :param new_value: 需要修改的值
        :return:
        """
        p = self.head.ptr_next
        for i in range(index):
        	# 需要修改的索引值不在链表中异常
            if p.ptr_next is None:
                raise IndexError("LinkList index out of range")
            p = p.ptr_next
        p.val = new_value

在这里插入图片描述

	def is_empty(self):
        """
        判断链表是否为空
        :return: True 链表为空 
        		 False 链表不为空
        """
        if self.head.ptr_next is None:
            return True
        else:
            return False
	def print_show(self):
		"""
		打印链表中的所有元素
		"""
		p = self.head.ptr_next 
		while p is not None:
			print(p.value)
			p = p.ptr_next 
代码仅供参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值