目录
每日文案
要有最朴素的生活和最遥远的梦想,即使明日天寒地冻,路远马亡
一、链表
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。
链表的入口节点叫做头节点也就是head
如图所示:
二、链表类型
-
单链表
就是通过指针线性的指向下去,连接起来
-
双链表
双链表:每一个节点有两个指针域,一个指向前一个节点,一个指向下一个节点
双链表既可以向前查询也可以向后查询
-
循环链表
-
链表的存储方式
数组在内存中是连续存在的,但链表在内存中不是连续分布的,链表是通过指针域的指针链接在内存中各个节点。
三、类和对象的概念
类就像是一种概念,而对象就是这个概念的实例化,举个例子比如动物,它就具有一些"属性"和"方法" 比如体重,身高,性别之类的就是动物的属性,而睡觉,吃饭这些动作就是动物的方法
在代码中表示类使用class关键字,在类中定义的变量会成为该类的属性,而定义的函数就会成为该类的方法
class Animal:
# 比如我们定义一个name 就会成为所有实例的公共属性
name = "Tom"
#定义一个函数就会成为该类的方法
def hello(self):
print("hello")
#在使用类之前要先创建一个实例
animal1 = Animal()
animal2 = Animal()
#实例化之后可以调用属性
animal1.name="Jerry"
animal2.name="Mike"
#实例可以调用方法
animal1.hello()
animal2.hello()
在Python中,当你定义一个类的方法时,你会注意到通常有一个名为self
的参数。这个参数并不是你手动添加的,而是在方法被调用时,Python会自动传递的。self
代表的是类的一个实例,也就是你通过类创建的对象。这样,你就可以在方法内部访问和操作这个对象的属性和其他方法。简而言之,self
就像是对象的别名,让你能够在方法内部引用到调用它的对象。
刚刚的类我是直接把name的值直接固定了,但后面我们的实例就name的值都是一样了 但在不同的对象实例应该是不同的 所以我们需要一个方法__init__ 用来初始化属性
class animal:
#这里我们定义一个__init__方法,name是实例传递的参数
def __init__(self,name):
#self表示实例本身,也就是实例.name=传递的name值
self.name = name
__init__方法在创建实例的时候会立刻执行用来给新创建的对象初始化属性,调用类创建对象的时候,类后面的所有参数都会传递到__init__方法中
animal1= Animal("Jerry")
#"Jerry"这个值会传到__init__方法中,通过self.name=name,来初始化animal1的属性
所以我们定义一个类的基本格式就是
class 类名
#一个公共属性
#init初始化方法
def __init__(self,其他参数):
#其他方法
def method(self,其他参数):
四、链表操作
-
节点的定义
节点就是由一个数据域和一个指针域构成那么就可以说一个数据属性和一个指针属性,那么初始化一个新的节点,他的next一般都是不存在的,就是一个空值,None可以用来初始化或者重置对象的属性,用来表明属性当前的为空或者说没有设置,新设置的节点next都是None(新创建的节点一般都说都是最后一个所以指针域都是指向空)
#创建一个链表的节点类
class Node:
# init方法,初始化
def __init__(self,data)
self.data=data #数据域存储节点数据
self.next=None #指针域next初始化为None
-
链表的定义
一个链表是由多个节点连接起来的,所以我们还需要一个链表类来容纳链表的节点,链表类一般包括链表的头节点和链表的的节点长度这两个属性,那么类的定义就是
#定义链表类
class LinkList:
def __init__(self):
#第一个链表的头节点先初始化为None
self.head_Node = None
#链表长度属性,先初始化为0
self.length=0
-
链表的插入
定义完了链表的节点和链表之后我们需要把节点给穿起来,这个时候就需要一个新的方法来进行插入操作,接收传入的数据,构成一个新的节点,插到链表的尾巴
- 每加入一个节点,所以链表长度+1 也就是self.length+1
class LinkList:
def __init__(self)
self.HeadNode=data
self.length=0
def insert(self,data)
self.length+=1
- 还需要创建一个新的节点,并且把它初始化为data
new_Node=Node(data)
- 如果说当前的链表是空链表的话,那么加进来的第一个链表节点就是头节点
当我们要向链表中添加一个新节点,并且这个链表可能是空的,我们需要考虑两种不同的场景。如果链表是空的,这可以通过检查头节点是否为`None`或者链表的长度是否为零来判断。在这种情况下,我们直接将新创建的节点设为链表的头节点,并且将这个新节点作为结果返回。
if self.Head_node is None:
self.head_node = new_Node #将新进来的节点作为头节点
return self.head_node #直接返回不执行后面的代码
如果链表中已经包含了元素,我们的目标是将新节点添加到链表的末尾。为了实现这一点,我们需要定位到链表的最后一个元素。我们如何确定已经到达链表的末端呢?
这个过程遵循一个标准的模式:我们从链表的头节点出发,顺序访问每个节点,一直前进直到遇到一个节点,其后继节点(即next
属性)是None
。这个节点就是我们要找的链表的最后一个节点。一旦找到这个节点,我们就将其next
属性设置为指向新创建的节点,从而将新节点添加到链表的尾部。
current_Node = self.head_node #currentNode先指向头节点
#然后我们需要不断去往后移动currentNode 直到next为None的时候停止,也就是最后一个节点
while current_Node.next is not None:
current_node = current_node.next #current_node不断移动到下一个节点
当current_node.next为空的时候说明已经到了最后一个节点,之后需要将新创建的节点插到链表的尾部直接让next指向新插入的节点就好了
current_node.next = new_node #尾节点的next直接指向新的节点
return new_node #返回新的节点
-
完整代码
class LinkList:
def __init__(self):
self.head_node = None
self.length = 0
# 该方法名称为insert,接收data作为参数
def insert(self, data):
self.length += 1 # 链表长度 加 1
new_node = Node(data) # 创建一个新的链表节点,初始化值为 data
if self.head_node is None: # 如果当前链表为空链表
self.head_node = new_node # 新创建的链表节点为头节点
return self.head_node
current_node = self.head_node # 如果当前链表不是空链表, currentNode 指针初始指向 头节点
while current_node.next is not None:
# 不断移动 currentNode,直到 next 指针为空时停止,说明已经走到最后一个节点
current_node = current_node.next
current_node.next = new_node # 将新创建的节点插入到链表的尾部
return new_node # 返回插入的节点
如果想要打印链表节点,操作步骤和遍历链表直到找到最后一个节点的过程相似
# 打印链表
def print_link_list(self):
current_node = self.head_node # currentNode 指针初始指向 头节点
while current_node is not None:
print(current_node.data, end=" ") # 输出链表数据
current_node = current_node.next # 移动 currentNode
print()
总结
本次对python中的对像,类还有链表进行讲解