1. 链表反转算法解析与实现
链表反转是数据结构与算法中最经典的面试题之一,也是检验程序员基本功的试金石。作为一名经历过上百场技术面试的老兵,我见过太多候选人在这道看似简单的题目上翻车。今天我们就来彻底拆解这个算法,不仅让你理解如何实现,更要明白为什么这样实现。
1.1 链表基础回顾
链表(Linked List)是一种线性数据结构,由一系列节点(Node)组成,每个节点包含两个部分:存储数据的数据域(val)和指向下一个节点的指针域(next)。与数组不同,链表的元素在内存中不是连续存储的,而是通过指针链接在一起。
python复制class ListNode:
def __init__(self, val=0, next=None):
self.val = val # 数据域
self.next = next # 指针域
链表的主要操作包括:
- 遍历:从头节点开始,依次访问每个节点
- 插入:在指定位置添加新节点
- 删除:移除指定节点
- 反转:改变节点间的指向关系
提示:在面试中,面试官通常会要求你手写链表节点的定义,所以务必牢记这个基础结构。
1.2 反转算法的核心思想
链表反转的核心思路可以用三个关键动作概括:
- 保存当前节点的下一个节点(防止断链)
- 将当前节点的next指针指向前一个节点(反转指向)
- 移动pre和cur指针到下一个位置(推进遍历)
这个过程就像一群人排成一列向后转,每个人都需要先记住自己后面是谁(保存nxt),然后转身面向前面的人(cur.next = pre),最后大家一起向前迈一步(pre, cur = cur, nxt)。
python复制def reverse_list(head):
pre = None # 前驱节点初始为None
cur = head # 当前节点从头节点开始
while cur:
nxt = cur.next # 步骤1:保存下一个节点
cur.next = pre # 步骤2:反转指针
pre = cur # 步骤3:前驱节点前进
cur = nxt # 步骤3:当
