206.反转链表

78 阅读1分钟

题目

🔗题目链接:206. 反转链表 - 力扣(LeetCode)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

示例 2:

输入: head = [1,2]
输出: [2,1]

示例 3:

输入: head = []
输出: []

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

思路

使用双指针

代码

迭代/循环

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */
function reverseList(head: ListNode | null): ListNode | null {
  if (!head) return null;


  let temp = null;
  let pre = null;
  let cur = head;

  while (cur) {
    // 将当前结点的下一个结点保存下来
    // 因为在 cur.next 往前指的时候
    // cur 结点与 cur.next指向的结点会断开
    temp = cur.next;
    // 反转链表
    cur.next = pre;

    // pre 指针往后移
    pre = cur;
    // cur 指针拿到断开的原链表新形成的头结点
    // 也就是
    //         pre cur
    //         ⬇️  ⬇️
    // null <- 1   2 -> 3 -> 4 -> 5
    cur = temp;
  }
    
  return pre;
};

递归

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function reverse(pre: ListNode, cur: ListNode) {
  if (!cur) return pre;

  const temp = cur.next;
  cur.next = pre;
  pre = cur;
  cur = temp;

  return reverse(pre, cur);
}

function reverseList(head: ListNode | null): ListNode | null {
  if (!head) return null;

  return reverse(null, head);
}