LeetCode算法题206:反转链表
题目描述
给你一个单链表的头结点head,请你反转链表,并返回反转后的链表。
示例一:
输入:head = [1, 3]
输出:[3, 1]
示例二:
输入:head = [1, 3, 4, 6, 9]
输出:[9, 6, 4, 3, 1]
示例三:
输入:head = []
输出:[]
解题方法(一):双指针迭代法
思路
- 首先定义两个指针curr和prev,其中curr指的是当前节点,初始值为head,prev指的是它的上一个节点,初始值为null。一次走一步,直到curr走到链表的尾部, 用next将当前节点的下一个节点保存下来
- 每走一步就让curr的next指向prev,这样就完成了一次反转
- 将当前节点下一个节点赋值给当前节点,将更新后的当前节点赋值给它的上一个节点prev,即prev指向curr,curr指向curr的下一个节点
代码
function reverseList(head) {
let curr = head; //当前节点curr
let prev = null; //当前节点的前一个节点prev
while(curr) {
//这里将当前节点的下一个节点保存到next
const next = curr.next;
curr.next = prev;
//迭代更新prev节点
prev = curr;
//迭代更新curr节点
curr = prev;
}
return prev;
}
复杂度分析
时间复杂度O(n), 空间复杂度O(1)
解题方法(二):递归法
思路
- 递归到链表的最后一个节点
- 将当前节点的下一个节点的next指针指向当前节点,由于反转后不应该指向右边,所以需要断开,让当前节点的next指针指向null
- 返回当前节点,直到递归结束
代码
var reverseList = function(head) {
//首先判断如果head==null说明第一次传入的节点为null,直接返回
//判断head.next==null说明已经递归到链表尾部,返回尾部元素
if(head==null || head.next==null) {
return head;
}
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null
return newHead;
}
复杂度分析
时间复杂度和空间复杂的都是O(n)
最后
如果有帮助到你,请给这篇文章点个赞和收藏吧,让更多的人看到 ~ ("▔□▔)/
如果有异议的地方,欢迎在评论区留言,我都会逐一回复 ~
如果感兴趣的话,欢迎访问 眼里要有光的博客