JS反转链表 - I

解题思路

1. 首先考虑思路就是进行前序遍历,将每一个节点的指针进行反转,在循环遍历时需要对每一个节点进行操作,这里我们用cur变量用于在遍历时保存当前节点;

2. JS单向链表是只有next指针的,要想对齐进行反转,需要一个类似于next的变量来保存反向的指针(即反转以后的next指针),这里定义一个变量prev,因为next是对象类型的变量,所以我们将初始化为 null;

3. 我们需要将每一个节点的next的值指向prev,这就需要进行将当前节点的next值指向prev,即cur.next = prev ;

4. 然后我们将继续遍历当前节点的下一个节点,即 cur = cur.next,但是由于我们在第3步已经修改了 cur.next ,现在再需要使用时,cur.next 已经发生了变化,因此我们需要定义一个临时变量temp来存储这个需要修改两次的值,防止它在第一次修改完,原始值丢失

5. 将 prev = cur,cur = cur.next 循环的当前节点后移即可

需要定义的变量及其初始化

这里需要仔细思考,哪些变量的指针要进行多次变化,如果是,其原始值是否还会再次使用;如果只用一次或者变化以后,原始值不再使用,就需要一个变量保存原始值,便于后续取用

let cur = pHead; // pHead为当前给定的头结点
let temp = null;
let prev = null;

返回值的确定

循环遍历的终止条件是当前节点为 null ,当循环结束时,prev相当于是正向链表的next指针,而prev也是刚好在当前反转链表的头节点,所以返回cur即可

完整代码

// function ListNode(x){
//     this.val = x;
//     this.next = null;
// }

// 单向链表
function ReverseList(pHead){
    // 首先排除链表为空或者链表只有一个节点的情况
    if(pHead == null || pHead.next == null){
        return pHead
    }
        let temp = null;
        let prev = null;
        let cur = pHead; // 用于在遍历时保存当前节点
    while(cur!=null){  
        temp = cur.next;
        cur.next = prev; //最关键的一步,修改链表指向
        prev = cur;  // 修改完指向以后,更新它的值
        cur = temp;  // 耿欣当前节点的值
    }
    return prev; // 是反转后的链表的表头
}
    
module.exports = {
    ReverseList : ReverseList
};

本文思路参考如下视频 http://【Leetcode刷题 206.反转链表 Reverse Linked List-哔哩哔哩】 https://b23.tv/hex6XfE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值