👦博主介绍:程序员悟啦(乌拉~)
✍个人仓库:码云
🔊座右铭:“懒”对一个人的毁灭性有多大,早起的重要性就多大。
📚免责声明:大文章由博主原创、部分文章整理于网络,仅供学习和知识分享
💬相遇是缘,既然来了就拎着小板凳🪑坐下来一起唠会儿👁🗨,如果在文中有所收获,请别忘了一键三连,动动你发财的小手👍,你的鼓励,是我创作的动力🤤!
剑指Offer-反转链表
🤔题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
Input:1 -> 2 -> 3 -> 4 -> 5 -> NULL
Output:5 -> 4 -> 3 -> 2 -> 1 -> NULL
✍方法一:迭代(双指针)
📖解题思路
如下图所示,题目要求将链表反转。所有将使用迭代(双指针)、递归两种实现方法。
考虑遍历链表,并在访问各个节点时修改next引用指向
💱图解
🧱代码
// java code
class Solution {
public ListNode reverseList(ListNode head){
ListNode cur = head, pre = null;
while (cur != null){
ListNode tmp = cur.next; //暂存后续节点 cur.next
cur.next = pre; //修改next引用指向
pre = cur; //pre 暂存cur
cur = tmp; //cur 访问下一个节点
}
return pre;
}
}
# python code
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, pre = head, None
while cur:
tmp = cur.next # 暂存后继节点 cur.next
cur.next = pre # 修改 next 引用指向
pre = cur # pre 暂存 cur
cur = tmp # cur 访问下一节点
return pre
# 利用 Python 语言的平行赋值语法,可以进一步简化代码(但可读性下降):
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, pre = head, None
while cur:
cur.next, pre, cur = pre, cur, cur.next
return pre
🎨复杂度分析
- 时间复杂度 O(N): 遍历链表使用线性大小时间。
- 空间复杂度 O(1): 变量
pre
和cur
使用常数大小额外空间。
✍方法二:递归
考虑使用递归遍历链表,当越过尾节点后终止递归,在回溯时修改各个节点的next引用指向。
📖解题思路
recur(cur, pre) 递归函数:
1、终止条件:当 cur 为空,则返回尾节点 pre (即反转链表的头节点);
2、递归后继节点,记录返回值(即反转链表的头节点)为 res ;
3、修改当前节点 cur 引用指向前驱节点 pre ;
4、返回反转链表的头节点 res ;
reverseList(head) 函数: 调用并返回 recur(head, null) 。传入 null 是因为反转链表后, head 节点指向 null ;
💱图解
🧱代码
// java code
class Solution {
public ListNode reverseList(ListNode head) {
return recur(head, null); // 调用递归并返回
}
private ListNode recur(ListNode cur, ListNode pre) {
if (cur == null) return pre; // 终止条件
ListNode res = recur(cur.next, cur); // 递归后继节点
cur.next = pre; // 修改节点引用指向
return res; // 返回反转链表的头节点
}
}
# python code
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
def recur(cur, pre):
if not cur: return pre # 终止条件
res = recur(cur.next, cur) # 递归后继节点
cur.next = pre # 修改节点引用指向
return res # 返回反转链表的头节点
return recur(head, None) # 调用递归并返回
🎨复杂度分析
- 时间复杂度 O(N): 遍历链表使用线性大小时间。
- 空间复杂度 O(N): 遍历链表的递归深度达到 N,系统使用 O(N)大小额外空间。
如在文中有所收获,请点赞👍+关注,传统美德不能丢🙌