206. 反转链表
代码
ts
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function reverseList(head: ListNode | null): ListNode | null {
let prev = null;
let now = head;
while(now){
const next = now.next;
now.next = prev;
prev = now;
now = next;
}
return prev;
};思路
使用迭代法反转链表:
初始化三个指针:
prev = null:指向前一个节点now = head:指向当前节点next:临时保存下一个节点
遍历链表,对每个节点进行操作:
- 保存当前节点的下一个节点:
next = now.next - 反转当前节点的指针:
now.next = prev - 移动
prev和now指针:prev = now,now = next
- 保存当前节点的下一个节点:
当
now为null时,prev就是新的头节点
这个算法通过改变每个节点的 next 指针方向来实现链表反转,是最经典的链表反转方法。
- 时间复杂度
,其中 是链表的长度 - 空间复杂度