每日一道算法Day33 -- 反转单向链表

129 阅读1分钟

题目描述

image.png

大致思路:

定义一个指向当前的指针cur以及指向前一位的指针prev, 遍历链表, 进行交换.

交换代码如下:

  1. 利用临时变量 tmp记录当前指针的下一个位置
let cur: ListNode | null = head;
let prev: ListNode | null = null;
while(cur !== null){
  const tmp: ListNode | null = cur.next;
  //将当前指针指向上一个
  cur.next = prev;
  //上一个指针后移
  prev = cur;
  //当前指针后移
  cur = tmp;
}
//最后返回上一个指针, 此时指向原链表的最后一位, 也就是反转后的第一位
return prev;
  1. 利用 es6 数组解构进行交换
let cur: ListNode | null = head;
let prev: ListNode | null = null;
while(cur !== null){
  [cur.next, prev, cur] = [prev, cur, cur.next];
}
return prev;
  1. 尾递归

export function reverseList(head: ListNode | null): ListNode | null {
  const reverse = (prev: ListNode | null, cur: ListNode | null): ListNode | null => {
    if (!cur) {
      return prev;
    }
    const nextP = cur.next;
    cur.next = prev;
    return reverse(cur, nextP);
  };
  return reverse(null, head);
}