单链表是线性表的一种链式存储结构,是数据结构中最基础、最核心的结构之一,也是很多复杂数据结构的基础。
线性表的顺序存储(数组)是连续内存存储,而单链表是非连续、非顺序的存储结构:
-
链表中的每个元素被称为节点(Node)
-
每个节点由两部分组成:
- 数据域(data) :存储实际的数据(比如你代码里的
10、11、12) - 指针域(next) :存储下一个节点的内存地址,用来串联起整个链表
- 数据域(data) :存储实际的数据(比如你代码里的
-
链表的第一个节点叫头节点(head) ,最后一个节点叫尾节点(tail) ,尾节点的
next指针永远指向None(空),表示链表结束。
节点类 SNode
class SNode(object):
def __init__(self, data):
self.data = data # 数据域:存储当前节点的数据
self.next = None # 指针域:默认指向空(新节点默认是尾节点)
-
作用:定义链表的最小单元 —— 节点
-
每个节点创建时,只需要传入数据,
next默认是空,因为新节点还没被接入链表
链表类 SingleLinkedList
class SingleLinkedList(object):
def __init__(self):
self.head = None # 头节点指针:初始为空(空链表)
self.tail = None # 尾节点指针:初始为空(空链表)
-
作用:管理整个链表,维护头、尾两个指针,实现链表的增删改查
-
空链表的状态:
head和tail都为None
尾插法 insert_tail(你代码的核心)
# 尾插入:把元素添加到链表的尾部
def insert_tail(self, ele):
# 1. 创建新节点,把要插入的数据ele存入节点
node = SNode(ele) #
2. 判断链表是否为空(头节点为None就是空链表)
if self.head == None: # 空链表:新节点既是头节点,也是尾节点
self.head = node
self.tail = node
return # 插入完成,直接返回
# 3. 链表非空:把当前尾节点的next指向新节点(串联)
self.tail.next = node #
4. 更新尾节点指针:新节点变成新的尾节点
self.tail = node
-
时间复杂度:O(1) (因为直接用尾指针操作,不需要遍历链表)
-
执行流程(以插入
10、11、12为例):- 插入
10:链表为空 →head=tail=节点10 - 插入
11:链表非空 →节点10.next=节点11→tail=节点11 - 插入
12:链表非空 →节点11.next=节点12→tail=节点12
- 插入
遍历打印 printAll
def printAll(self):
# 1. 用临时指针p从头节点开始遍历(不修改原链表的head)
p = self.head
# 2. 只要p不为空,就一直遍历(到尾节点的next=None时停止)
while p != None:
print(p.data) # 打印当前节点的数据
p = p.next # p移动到下一个节点
-
时间复杂度:O(n) (必须遍历所有节点才能打印全部数据)
-
注意:绝对不能直接用
self.head遍历,否则会修改原链表的头指针,导致链表丢失!
测试代码
s = SingleLinkedList()
s.insert_tail(10)
s.insert_tail(11)
s.insert_tail(12)
s.printAll()
运行结果
10
11
12
整体代码
class SNode(object):
def __init__(self, data):
self.data = data # 当前的数据
self.next = None # 下一个节点是?
class SingleLinkedList(object):
def __init__(self):
self.head = None
self.tail = None
# 尾插入,把元素添加到当前链表的尾部
def insert_tail(self, ele):
node = SNode(ele)
# 检查链表是不是空?
if self.head == None:
self.head = node
self.tail = node
return
self.tail.next = node
self.tail = node
def printAll(self):
p = self.head
while p != None:
print(p.data)
p = p.next
s = SingleLinkedList()
s.insert_tail(10)
s.insert_tail(11)
s.insert_tail(12)
s.insert_tail(13)
s.printAll()