【LeetCode刷题】NO.26---第206题

101 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目

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

示例 1:

image.png

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

示例 2:

image.png

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

示例 3:

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

提示:

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

二、思路分析:

首先这是一道链表题,包含了链表操作,那么我们首先想到双指针进行求解。首先我们创建两个指针分别指向头结点,然后创建一个暂存变量赋值为NULL,第一个指针的next指向链表的下一个结点,让第二个指针的next指向暂存变量,随后暂存变量变为第二个指针,第二个指针赋值为第一个指针,这样一直循环直到第一个指针指向的值为空即可。

还有一种方法就是使用递归的思路进行求解,因为一个大问题可以分解成若干个同样的小问题,那么我们就可以使用递归函数将head头结点跟它后面的结点分开,然后使用指针的相关操作让每个结点的指针顺序反转即可。

三、代码:

递归方法:

var reverseList = function(head) {
    
    if(head == null || head.next == null) return head
    let last = reverseList(head.next)
    head.next.next = head
    head.next = null
    return last
    
};

指针方法:

/**
 * 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) {
    if(head == null || head.next == null) return head
    let vode = null 
    let p = q = head
    while(p){
        p = p.next
        q.next = vode
        vode = q
        q = p
    }
    return vode 
};

四、总结:

反转链表的题目利用递归的方法思路比较清晰,但是很难想到利用递归,所以需要我们努力掌握递归的精髓,了解它才能熟练使用它。