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