[面试精选] 0206. 反转链表
文章目录
- 1. 题目链接
- 2. 题目描述
- 3. 题目示例
- 4. 解题思路
- 5. 题解代码
- 6. 复杂度分析
1. 题目链接
206. 反转链表 - 力扣(LeetCode)
2. 题目描述
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
3. 题目示例
示例 1 :
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2 :
输入:head = [1,2]
输出:[2,1]
4. 解题思路
- 问题理解:
- 给定一个单链表,要求将其反转
- 反转后原链表的头节点变为尾节点,尾节点变为头节点
- 所有节点的next指针方向需要反转
- 关键思路:
- 三指针法:使用pre、cur、nxt三个指针
- pre:记录前驱节点(已反转部分的头节点)
- cur:当前待处理节点
- nxt:临时保存下一个待处理节点
- 指针操作:
- 保存当前节点的下一个节点(nxt = cur.next)
- 反转当前节点的指针(cur.next = pre)
- 前移pre指针(pre = cur)
- 前移cur指针(cur = nxt)
- 三指针法:使用pre、cur、nxt三个指针
- 算法流程:
- 初始化pre为null,cur为head
- 遍历链表:
- 每次处理一个节点,反转其指针方向
- 更新pre和cur指针
- 当cur为null时,pre即为新链表的头节点
5. 题解代码
class Solution {public ListNode reverseList(ListNode head) {// pre指针用于记录前驱节点,初始为null(反转后的尾节点指向null)ListNode pre = null;// cur指针用于遍历链表,初始指向头节点ListNode cur = head;// 遍历链表直到当前节点为nullwhile (cur != null) {// 临时保存当前节点的下一个节点ListNode nxt = cur.next;// 反转当前节点的指针方向,指向前驱节点cur.next = pre;// pre指针前移到当前节点pre = cur;// cur指针移动到之前保存的下一个节点cur = nxt;}// 循环结束时pre指向新的头节点return pre;}
}
6. 复杂度分析
- 时间复杂度:
- 需要遍历整个链表一次
- 时间复杂度为O(n),n为链表长度
- 空间复杂度:
- 只使用了常数个额外指针
- 空间复杂度为O(1)