Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一.题目
206. 反转链表 给你单链表的头节点
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
二、思路分析:
首先这是一道链表题,包含了链表操作,那么我们首先想到双指针进行求解。首先我们创建两个指针分别指向头结点,然后创建一个暂存变量赋值为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
};
四、总结:
反转链表的题目利用递归的方法思路比较清晰,但是很难想到利用递归,所以需要我们努力掌握递归的精髓,了解它才能熟练使用它。