为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第八天 反转链表

标签:
算法

第一模块:课程介绍

课程名称:JavaScript版数据结构与算法 轻松解决前端算法面试
课程章节:LeetCode:206.反转链表
主讲老师:lewis

第二模块:课程内容

对反转链表的题目进行编写代码

第三模块:课程收获

1. 题目大概

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

解题思路

  1. 如何反转两个节点呢?

只需要将n+1的next指向n就好了

示例代码:

 const next = p1.next;
// 将下一个节点2指向它的上一个借点
p1.next = p2;
  1. 如何反转多个节点?

可以使用双指针遍历链表,然后重复上面的反转两个节点的操作。

双指针遍历链表指的是,假如有ab两个指针,开始的时候,b指向1,a指向null,再下一步的时候,b指向2,a指向1。直到b走到尽头就停止。

这样的话,就可以不停的反转ab就好了。

解题步骤

  1. 双指针一前一后遍历链表
  2. 反转双指针

第一步,找到位置

图片描述

开始的时候,给a和b放到对应的位置去。

代码示例

var reverseList = function(head) {
    let b = head;
    let a = null;
};

开始遍历链表

我们在b有值的情况下,不停的往后移,同时还要把a移动到b当前所在的位置。所以,先把b赋值给a,再把b的下一个赋值给b。
代码示例

var reverseList = function(head) {
    let b = head;
    let a = null;
    while(b){
        console.log(b.val, a?.val)
        a = b;
        b = b.next;
    }
};

输出:

a undefined
b a
c b
d c

上面的双指针移动就算是完成了。那接下来就要开始做反转。也就是要把b指向a就好了。

b.next = a;

但是上面这么写的话会导致b往后移动的时候,它的下一个变成了a,结果变成了往前移动了。这样显然是不对的,所以需要找到第三者来暂时报错下这个,这样就可以继续往下走了。

示例代码:

var reverseList = function(head) {
    let b = head;
    let a = null;
    while(b){
        const c = b.next;
        b.next = a;
        a = b;
        b = c;
    }
};

那么到现在,代码算是完成了,但是需要返回a还是b呢。

因为b不停的再往后挪,到最后的时候,b就变成了undefined了,当b变成undefined的时候,a也就不挪动了。a停留在最后一个节点处。所以要返回的就是a

代码示例:

var reverseList = function(head) {
    let b = head;
    let a = null;
    while(b){
        const c = b.next;
        b.next = a;
        a = b;
        b = c;
    }
    return b;
};

结果

图片描述

这个主要是学习双指针遍历的方法,练习双指针的使用,难点在于对反转的理解吧。开始一直搞不清楚为什么要把a = b,b=c后面才想清楚,a = b是因为要把b往后移动,b = c是要把c也往后移动,但是还要进行反转操作,所以要把b指向a,如果一开始就把b指向a的话,b的下一个节点名字就错了。所以要用c来把b的下一个节点存起来。

第四模块:课程记录

图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消