开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
题目
给你单链表的头节点
head,请你反转链表,并返回反转后的链表。
输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]
思路一
我们这里先新建一个变量newHead,默认值为null,它是倒置的新头节点,然后我们使用循环,如果当前的head形参不为null则一直循环,因为倒置的过程需要知道是否全部倒置完了即未倒置的头节点是null值,在循环中我们先保存未倒置节点的下一个节点,将head形参的next属性值存储到next变量中,然后将新节点指向head的next属性值,也就是将第一个节点倒置指向新的头节点,然后再讲head形参赋值给newHead变量,进行更新下倒置后的头节点,然后再讲未倒置的头节点进行更新,将next变量赋值给head形参,最后将倒置后的newHead链表返回出去即可
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function (head) {
let newHead = null
while (head !== null) {
let next = head.next
head.next = newHead
newHead = head
head = next
}
return newHead
};
思路二
我们这里还可以使用递归的方式进行反转链表,我们先判断head是否为null或者为最后一个节点时,如果是则直接返回head本身,然后再声明一个lastHead变量,用于存储调用自身的返回值,我们将当前head形参的next传给自身进行调用,反转head节点后面的节点,并返回最后一个节点,然后将head指向的next的next指向head,进行反转head和next,最后head的next指向null,这样就完成链表反转了,然后再反转后的链表返回出去即可
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
if(head === null || head.next === null) {
return head;
}
const lastHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return lastHead;
};