数据结构单链表

5 阅读3分钟

单链表是线性表的一种链式存储结构,是数据结构中最基础、最核心的结构之一,也是很多复杂数据结构的基础。

线性表的顺序存储(数组)是连续内存存储,而单链表是非连续、非顺序的存储结构:

  • 链表中的每个元素被称为节点(Node)

  • 每个节点由两部分组成:

    1. 数据域(data) :存储实际的数据(比如你代码里的10、11、12
    2. 指针域(next) :存储下一个节点的内存地址,用来串联起整个链表
  • 链表的第一个节点叫头节点(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 # 尾节点指针:初始为空(空链表)
  • 作用:管理整个链表,维护头、尾两个指针,实现链表的增删改查

  • 空链表的状态:headtail都为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为例):

    1. 插入10:链表为空 → head=tail=节点10
    2. 插入11:链表非空 → 节点10.next=节点11tail=节点11
    3. 插入12:链表非空 → 节点11.next=节点12tail=节点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()