题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
分析
输入:链表 head
输出:反转后的链表 head
解题方法
如果有长度为 4 的链表(1 ➡️ 2 ➡️ 3 ➡️ 4)
其实所谓反转的过程,就是把 2 的 next 指向 1,把 3 的 next 指向 2,把 4 的 next 指向 3.
我们看图:
我们借助 dummyHead 去作为反转后链表的头节点,返回结果的时候直接 return dummyHead.next,所以 dummyHead.next 最终会指向 4,这也符合我们上述操作的流程。
先把1拿过来,放到 dummyHead 后边,这个过程需要改变 dummyHead.next 以及 head.next
这里要注意,在链表操作的过程中,最重要的是保证指针不要丢失,所以在改变 next 的时候,我们要注意思考是不是需要一个变量去存储 next 的指向。
这里我们需要存储 dummyHead.next head.next,就可以保证指针不被丢失。
第一步之后,我们把 head 移动到下一个,也就是 2
再次操作后得到
所有节点遍历一遍,我们就可以得到结果了~
代码
/**
* 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) {
const dummyHead = new ListNode(null)
while (head) {
const tmp = dummyHead.next
const tmp2 = head.next
dummyHead.next = head
head.next = tmp
head = tmp2
}
return dummyHead.next
};
复杂度
时间:O(N), 所有节点遍历一遍
空间:O(1), 三个额外的指针,指向 dummyHead,dummyHead.next, head.next