LeetCode刷题,反转链表(206)

1,275 阅读2分钟

反转链表

将一条单向链表,反转,返回反转后的链表。 例:1->2->3->4->5 转换为 5->4->3->2->1

思路一:定义多个指针进行互换

  1. 先定义3个指针,pre(代表反转后的链表头结点) cur(代表未反转链表的头节点) next(未反转的下一位)
  2. 第一步让pre指向空,cur指向当前链表头节点,next指向当前cur的下一位节点。
  3. 第二步让cur指向pre,然后将pre移动到cur的位置,cur移动到next的位置,next移动到再下一位节点
  4. 重复第二步操作,直至链表走到末尾,最后返回pre就是反转后的链表。

思路一:JS代码实现

var reverseList = function(head) {
  if (!head) return null;
  let pre = null; // 反转链表的头结点
  let cur = head; // 未反转头结点
  let next = head.next; // 下一位结点
  while (cur) {
    cur.next = pre; // 当前节点的下一位 指向pre
    pre = cur; // pre 移动到当前链表头节点位置
    cur = next; // 当前头节点位置往后移动一位
    next && (next = next.next) // 如果下一位不为空,那么代表链表还有值,下一位再移动一位,至此完成了一个节点反转,继续循环直至链表结束。
  }
  return pre; // 返回反转链表头结点
};

思路二:递归法

递归交换节点,交换时将当前节点赋值给交换节点之后下一位节点、

思路二:代码实现

var reverseList = function(head) {
  if (!head) return head; // 如果链表为空返回当前链表
  if (!head.next) return head; // 如果链表只有一位,那么也返回当前链表
  let next = head.next; // 下一位结点 
  let p = reverseList(head.next); // 获取反转后的链表头节点
  head.next = next.next; // 将当前节点反转
  next.next = head; // 将下下个节点指回当前头节点 如  1 2 3 ,当前节点是 2,然后将3->2,最后将1连接到2后面 就是 3->2->1
  return p;
};