Skip to content

反转链表

反转链表

推荐题解

双指针迭代

js
var reverseList = function (head) {
  let prev = null; // 上一个节点
  let current = head; // 当前的节点

  while (current) {
    let temp = current.next; // 当前节点后面的节点. 方便下一次遍历去拿值
    current.next = prev; // 当前节点的下一个节点,指向原来的上一个节点
    prev = current; // prev 赋值为最终链表的段落, 方便下一次拼接
    current = temp; // 当前设置为最开始存储的值
  }

  return prev;
};

遍历成数组后, 拼接链表(不推荐)

js
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function (head) {
  let arr = [];
  // 先遍历一次, 把链表的所有节点放进数组
  while (head) {
    arr.push(head);
    head = head.next;
  }

  if (arr.length === 0) return head;
  // 当前正在处理的节点
  let currentNode = arr[arr.length - 1];

  let result = currentNode;
  // 反向遍历数组, 依次组装成链表
  for (let i = arr.length - 2; i >= 0; i--) {
    arr[i].next = null;
    currentNode.next = arr[i];
    currentNode = currentNode.next;
  }
  return result;
};