反转链表

描述

给定一个单链表的头结点 pHead(该头节点是有值的,比如在下图,它的 val 是 1,长度为 n,反转该链表后,返回新链表的表头。

数据范围:

0 <= n <= 1000 要求:

空间复杂度 O(1),时间复杂度 O(n)。

如当输入链表{1,2,3}时,

经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

以上转换过程如下图所示:

反转链表

代码

function ReverseList(pHead) {
  // write code here
  // 参数检查
  if (pHead == null || pHead.next == null) {
    return pHead;
  }
  // 初始化中间变量
  var previousNode = null;
  var nextNode = null;
  while (pHead) {
    // 保存当前节点的下一节点
    nextNode = pHead.next;
    // 修改当前节点的指向为上一节点
    pHead.next = previousNode;
    // 将当前节点保存为上一节点
    previousNode = pHead;
    // 切换到下一节点
    pHead = nextNode;
  }
  return previousNode;
}

代码解释

  1. 首先检查入参,假如传入一个空链表或者链表中只有一个值,那就不需要反转,直接返回传入的链表即可。
  2. 初始化两个中间变量,可以理解为下一节点指针和上一节点指针。
  3. 这时候我们就有了三个指针,当前节点指针,下一节点指针和上一节点指针。
  4. 进入循环之后,将下一节点指针指向当前节点的下一节点。
  5. 将当前节点的 next 指针指向上一个节点。
  6. 将上一节点指针指向当前节点,下次循环使用。
  7. 当前节点指针指向到下一节点指针指向的节点。
  8. 一直循环到链表遍历完毕。

返回上一节点指针(在最后一次循环里,上一节点指针指向了当前节点,当前节点指针指向了下一节点指针指向的 null)。

总结?

这里其实有个动图什么的来解释比较合适…

很简单…

评论0

  • 还没有评论,来说点什么吧。