Python入门第五天:链表与面向对象编程基础
2026/7/17 5:12:58 网站建设 项目流程

链表的基础操作

1. 数组与字符串的局限性

先前的字符串和数组(列表)两种结构:它们的元素按照一定的顺序排列,可以通过索引来访问数组中的元素和字符串中的字符。

缺点:

  1. 固定大小:超出预设大小就需要整体复制到新的内存空间
  2. 内存连续:导致内存碎片化,造成空间浪费
  3. 数据类型固定:只能存储相同类型的数据

2. 链表的概念

链表:链表的元素存储可以是不连续的,每个数据元素除了存储本身的信息,还存储下一个元素的地址(指针)。

  • 第一个节点的存储位置被称为头节点(head)
  • 通过next指针找到下一个节点,直到找到最后一个节点
  • 最后一个节点的next指针指向None(Python 中表示空指针)

面向对象编程基础

1. 面向对象概念

如何在计算机世界表示人:

  1. 首先抽象成一个类Person:包括姓名、性别、年龄属性和吃饭的方法
  2. 如果想表示具体的某一个人,需要创建类的实例(对象)

2. 类的定义

Class 类:

  • 类的命名要使用大驼峰形式(如MyName
  • 在类的代码块中,可以定义变量和函数
  • 类中定义的变量会成为所有实例的属性,所有实例都可以访问这些变量
  • 类中定义的函数被称为方法,类的所有实例也可以访问这些方法
classPerson:# 类中定义一个变量 name,会成为所有实例的公共属性name="Tom"# 类中定义函数,称之为方法,方法也可以通过该类的实例来访问defsay_hello(self):print("Hello")# 创建 Person 的实例person1=Person()person2=Person()# 实例可以调用属性person1.name="Jerry"person2.name="Mike"# 实例可以调用方法person1.say_hello()person2.say_hello()

3. 类的特殊方法

  • 类中的方法被调用时,Python 会自动传递一个参数,通常命名为self
  • __init__方法用于初始化实例属性,避免属性值被固定

Python 类的基本结构:

class类名:# 公共属性# __init__ 方法def__init__(self,其他参数):# 初始化代码# 其他方法defmethod_1(self,其他参数):# 方法实现

链表的实现

1. 定义链表节点

# 1. 定义链表节点类classNode:# __init__ 方法,初始化属性def__init__(self,data):self.data=data# 存储节点的数据self.next=None# next 指针初始化为 None

2. 定义链表类

# 2. 定义链表类,用于容纳链表节点classLinkList:def__init__(self):# 链表头节点,初始化为 Noneself.head_node=None# 链表长度,初始化为 0self.length=0

链表的插入操作

1. 尾部插入(append / addLast)

目的:把一个新的数据节点,按顺序挂到整个链表的最后面。

步骤:

  1. 维护长度:链表长度 + 1
  2. 创建新节点:初始化值为 data
  3. 判断是否为第一个节点
    • 情况 A:如果链表是空的(头节点为空)
      • 把新节点设为头节点
    • 情况 B:如果链表不为空
      • 找到当前的尾节点
      • 将尾节点的next指向新节点
      • 新节点成为新的尾节点
classLinkList:def__init__(self):self.head_node=Noneself.length=0# 尾部插入方法definsert(self,data):self.length+=1# 链表长度加 1new_node=Node(data)# 创建新节点ifself.head_nodeisNone:# 如果链表为空self.head_node=new_node# 新节点成为头节点returnself.head_node# 如果链表不为空,找到尾节点current_node=self.head_nodewhilecurrent_node.nextisnotNone:current_node=current_node.next# 将新节点连接到链表尾部current_node.next=new_nodereturnnew_node# 返回插入的节点

完整的链表程序

# 链表节点类classNode:"""定义链表节点类,用于创建具体的节点对象"""def__init__(self,data):# 初始化方法,创建节点时调用(如 Node(5))self.data=data self.next=NoneclassLinkList:"""单向链表实现"""def__init__(self):# 刚创建的链表是空的,里面一个节点都没有self.head_node=Noneself.length=0# 初始化链表长度为 0definsert(self,data):"""在链表尾部插入新节点"""self.length+=1new_node=Node(data)ifself.head_nodeisNone:# 空链表self.head_node=new_nodereturnself.head_node# 非空链表,找到尾节点current_node=self.head_nodewhilecurrent_node.nextisnotNone:current_node=current_node.nextcurrent_node.next=new_nodereturnnew_nodedefprint_link_list(self):"""打印链表内容"""current_node=self.head_node# 从头节点开始遍历whilecurrent_nodeisnotNone:ifcurrent_node.nextisnotNone:print(current_node.data,end=" → ")else:print(current_node.data)# 最后一个节点current_node=current_node.next# 主程序if__name__=="__main__":whileTrue:try:n=int(input("请输入节点个数: "))elements=list(map(int,input("请输入节点数据(空格分隔): ").split()))except:breaklink_list=LinkList()fordatainelements:link_list.insert(data)print("链表内容: ",end="")link_list.print_link_list()

总结

  1. 链表 vs 数组:链表解决了数组的固定大小和连续内存问题
  2. 面向对象:通过类和对象来组织代码,提高代码复用性和可维护性
  3. 链表实现:包含节点类和链表类,支持基本的插入和遍历操作
  4. 核心操作:尾部插入是链表最基本的操作之一,需要正确处理空链表和非空链表的情况

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询