持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
LeetCode 75 学习计划适用于想为技术面试做准备但不确定应该聚焦于哪些题目的用户。学习计划中的题目都是经过精心挑选的,Level 1和 Level 2 学习计划是为初级用户和中级用户准备的,题目覆盖了大多数中层公司面试时所必需的数据结构和算法,Level 3 学习计划则是为准备面试顶级公司的用户准备的。来源
第 3 天
反转链表
难度:简单
题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]
解答
又是考验对链表的操作:
平常前端编程中很少用到链表这个数据结构,往往会以数组的思路去处理。
而链表是有它的特性的。
本题中
比如:1->2->3->4->5
链表的头是 1,颠倒顺序,head 肯定不是 1 了,更改指针,1 先 指向 null,然后 2 变为头了,就是 null <- 1 < -2 -> 3 -> 4 -> 5
然后继续修改头指针为 3 ,4 ,5 当 头指针再也不存在的时候,就说明指针已经全部颠倒过来了,输出返回。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let prev = null, curr = head
while (curr) {
const next = curr.next
curr.next = prev
prev = curr
curr = next
}
return prev
};
这个算法时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。空间复杂度:O(1)。
总结
链表的好处是什么?易插入、删除;坏处是什么?遍历比较麻烦。
再提供一个递归解法:
var reverseList = function(head) {
//方法2:在原来的链表上反转
function reverse(cur, pre) {
if(!cur) return pre;
let res = reverse(cur.next, cur);//后序遍历
cur.next = pre;//让每个节点的next指向前一个节点
return res;
}
return reverse(head, null);
};