# 206. 反转链表

# 题目

反转一个单链表。

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

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

# 题解

# 递归

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
  // 终止条件 节点为空或者是单个节点不需要反转
  if (!head || !head.next) return head;
  let p = reverseList(head.next);
  // 两个节点反转
  head.next.next = head;
  head.next = null;
  return p;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

时间复杂度:O(n) 空间复杂度:O(n)

# 迭代

反转链表需要三个节点

  • pre 前面
  • cur 当前
  • next 后面

每次循环做:

  • cur 指向 pre
  • pre 变为 cur
  • cur 变为 next

最后 pre 就是当前节点所以返回 pre

var reverseList = function(head) {
  let cur = head; // 当前节点是head
  let pre = null;

  // 当前节点存在的时候循环
  while (cur) {
    let next = cur.next;
    cur.next = pre;
    pre = cur;
    cur = next;
  }
  return pre;
};
1
2
3
4
5
6
7
8
9
10
11
12
13

时间复杂度:O(n) 空间复杂度:O(1)