这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
背景
学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。
问题
反转链表
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
示例:
输入:1=>2=>3=>4=>5=>null 输出:5=>4=>3=>2=>1=>null
解析思路:
我们遍历列表的时候,将当前节点的next指针指向上一个节点。就可以实现链表的反转。
那我们怎么在循环遍历的时候,建立next指向关系呢?
-
首先我们设置一个全局变量,用来临时存储上一个节点的引用。
-
由于我们第一个节点没有上一个节点,所以默认为 NULL,我们要替换当前节点next为上一个节点,但是我们指针要往下走,所以,先要临时保存当前节点的next(也就是下一个节点的引用)。然后再替换当前节点的next为下一个节点。
-
替换完节点以后,当前的节点即是下一个节点的上一个节点,所以我们全局变量替换为当前的节点。
-
指针向下走,也就是执行旧的next.
-
然后继续循环遍历下一个节点。
代码实现:
Definition for singly-linked list.
function ListNode(val) {
this.val = val;
this.next = null;
}
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
//默认上一节点为空
let pre=null;
//当前的节点
let cur=head;
while(cur){
//由于要覆盖原来下一个节点,所以先获取下一个节点保存。
var next = cur.next;
//替换原来的next为上一个pre
cur.next=pre;
//保存pre为当前节点,供下一次循环的节点使用。
pre=cur;
//指针向前移动
cur=next;
}
return pre;
};
验证结果:
结语
一步一步慢慢来,踏踏实实把活干!