[路飞]_leetcode_206.反转链表

83 阅读1分钟

思考

题目给出的是将一个链表反转,如下:

1->2->3->4->5 => 1<-2<-3<-4<-5

  • 首先反转链表需要将前一个节点指向下一个节点改为下一个节点指向前一个节点;
  • 然后一直做这个的循环,直到遇到下一个节点为null就停止,表示链表反转结束;
  • 当然在反转的过程中需要有一个指针来记录下一个待反转的节点。

解题思路

设置pre、cur、next三个指针:

  • pre作为反转链表需要被下一个节点指向的前一个节点,也可以说是反转后的链表的头指针;
  • cur作为当前节点准备指向pre节点;
  • next保存下一个待反转的节点。
  1. 检查cur节点是否为链表末尾 NULL ,如果是,则链表反转结束;
  2. 通过next保留下一个待反转的节点 也就是 cur.next;
  3. 开始反转操作,让cur指向pre;
  4. 反转完成 pre 走到 cur 的位置, cur 走到 next 的位置;
  5. 重复上述步骤
pre cur  next
null 1 -> 2 -> 3 -> 4 -> 5 -> null

pre    cur next
null <- 1  2 -> 3 -> 4 -> 5 -> null

       pre cur
null <- 1  2 -> 3 -> 4 -> 5 -> null

       pre cur next
null <- 1  2 -> 3 -> 4 -> 5 -> null

       pre cur next
null <- 1 <- 2  3 -> 4 -> 5 -> null

代码

var reverseList = function(head) {
    if (!head) return head;

    let pre = null, cur = head;
    // 检查cur节点是否为链表末尾 NULL ,如果是,则链表反转结束
    while (cur) {
        // 通过next保留下一个待反转的节点 也就是 cur.next
        let next = cur.next;
        // 开始反转操作,让cur指向pre
        cur.next = pre;
        // 反转完成 pre 走到 cur 的位置, cur 走到 next 的位置
        pre = cur;
        cur = next;
    }

    return pre;
};