leetcode-链表-206-反转链表

101 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

Hi, 大家好。

今后会按类分享算法题。

开始分享链表相关的算法题。

今天分享第一道题:反转链表

206. 反转链表

leetcode地址:leetcode.cn/problems/re…

难度

简单

描述

给你单链表的头节点 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

解法1

  1. 定义三个变量
  2. 定义变量 pre, 开始指向链表第一个值的前面,初始值为null
  3. 定义变量cur,指向链表的第一个节点,也就是head
  4. 定义变量next,指向第一个节点的下一个节点,也就行head.next,相当于cur.next
  5. 开始循环,当cur不是null的时候,一直可以遍历
  6. 首先将cur指向pre,这样就把第一个节点反转
  7. 然后把pre指向cur
  8. 最后把cur指向next
  9. 这样就可以进行下一个节点反转,直到cur为null
  10. 最后返回pre

解法2

用递归函数不断传入head.next,直到head==null或者heade.next==null,到了递归最后一层的时候,让后面一个节点指向前一个节点,然后让前一个节点的next置为空,直到到达第一层,就是链表的第一个节点,每一层都返回最后一个节点。

解法3

准备一个临时节点,然后遍历链表,准备两个指针head和next,每次循环到一个节点的时候,将head.next指向temp.next,并且将temp.next指向head,head和next向后移一位。

下面使用解法1 用代码实现以下:

代码

/**
 * 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 pre = null;
    let cur = head;
    

    while(cur !== null){
       let next = cur.next;
        
       cur.next = pre;
       pre = cur;
       cur = next;
    }
    return pre;
};