206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
思路1:迭代
以链表的头部节点为基准节点,将基准节点的下一个节点挪到头部作为头节点,当基准节点的next为null,则其已经成为最后一个节点,链表已经反转完成
代码:
1 /** 2 * Definition for singly-linked list. 3 * function ListNode(val, next) { 4 * this.val = (val===undefined ? 0 : val) 5 * this.next = (next===undefined ? null : next) 6 * } 7 */ 8 /** 9 * @param {ListNode} head 10 * @return {ListNode} 11 */ 12 var reverseList = function(head) { 13 let prev = null; 14 let curr = head; 15 let next = head; 16 while (curr !== null){ 17 next = curr.next; 18 curr.next = prev; 19 prev = curr; 20 curr = next; 21 } 22 return prev; 23 };
- 迭代:ES6解构赋值
假设链表为1→2→3→∅,我们想要把它改成 ∅←1←2←3。
在遍历链表时,将当前节点的next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
时间复杂度:O(n),其中 nn 是链表的长度。需要遍历链表一次。
空间复杂度:O(1)
1 /** 2 * Definition for singly-linked list. 3 * function ListNode(val, next) { 4 * this.val = (val===undefined ? 0 : val) 5 * this.next = (next===undefined ? null : next) 6 * } 7 */ 8 /** 9 * @param {ListNode} head 10 * @return {ListNode} 11 */ 12 var reverseList = function(head) { 13 let prev = null; 14 let curr = head; 15 let next = head; 16 while (curr !== null){ 17 [curr.next, curr, prev] = [prev, curr.next, curr]; 18 } 19 return prev; 20 };
思路2:递归
时间复杂度:O(n),其中 n是链表的长度。需要对链表的每个节点进行反转操作
空间复杂度:O(n),其中 n是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n层
1 var reverseList = function(head) { 2 if (head == null || head.next == null) { 3 return head; 4 } 5 const newHead = reverseList(head.next); 6 head.next.next = head; 7 head.next = null; 8 return newHead; 9 };

浙公网安备 33010602011771号