JS反转链表 - I

本文详细阐述了如何通过前序遍历和反转指针实现JS链表的反转,涉及关键变量初始化、操作步骤以及终止条件。通过实例代码展示了从头结点开始到链表尾部的整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路

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

### 反转链表算法实现 #### Python 实现方式 在Python中,可以通过定义`ListNode`类来表示单向链表中的节点,并利用迭代的方法完成链表反转。下面展示了一个完整的反转变换过程: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def reverseList(head: ListNode) -> ListNode: prev = None curr = head while curr is not None: nxt = curr.next # Store the reference to the rest of list. curr.next = prev # Reverse link direction. prev = curr # Move `prev` one step forward. curr = nxt # Move `curr` one step forward. return prev # New head after reversal will be last non-null node visited by `prev`. ``` 此段代码展示了如何创建一个辅助变量`nxt`用于保存当前节点之后的部分;接着修改当前节点的`next`指针使其指向其前驱节点(`prev`);最后更新两个游标的值以便继续处理剩余部分直到遍历结束[^1]。 对于JavaScript版本而言,逻辑上保持一致,只是语法有所区别: ```javascript function reverseList(head) { let prev = null; let current = head; while(current !== null){ const nextTemp = current.next; // Temporarily store next node. current.next = prev; // Point backwards. prev = current; // Advance previous pointer. current = nextTemp; // Advance current pointer. } return prev; // Return new head which was tail before reversing. } ``` 这段脚本同样实现了相同的功能,在每次循环体内先暂存下一个待访问的位置,再调整现有连接关系并逐步推进直至全部元素都被重新链接完毕[^2]。 无论是哪种编程语言下的具体编码细节差异,核心思路都是围绕着三个主要角色展开:原始列表头部、正在被考察位置以及即将成为新起点的地方。通过不断交换这三个量之间的关联最终达到整体方向上的逆转效果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值