课程名称:JavaScript版数据结构与算法 轻松解决前端算法面试
课程章节:LeetCode:206.反转链表
主讲老师:lewis
对反转链表的题目进行编写代码
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
只需要将n+1的next指向n就好了
示例代码:
const next = p1.next; // 将下一个节点2指向它的上一个借点 p1.next = p2;
可以使用双指针遍历链表,然后重复上面的反转两个节点的操作。
双指针遍历链表指的是,假如有ab两个指针,开始的时候,b指向1,a指向null,再下一步的时候,b指向2,a指向1。直到b走到尽头就停止。
这样的话,就可以不停的反转ab就好了。
第一步,找到位置
开始的时候,给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的下一个节点存起来。