206. 反转链表
题目描述
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
1 2 |
|
示例 2:
1 2 |
|
示例 3:
1 2 |
|
提示:
- 链表中节点的数目范围是 \([0, 5000]\)
- \(-5000\) \(≤\) \(Node.val\) \(≤\) \(5000\)
进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
遍历
时间复杂度\(O(n)\) 空间复杂度\(O(1)\)
定义前驱结点为pre
,当前结点为cur
,由于每次反转需要把当前结点的next指针指向前驱结点pre
,所以需要再定义一个next
用来存储当前结点的下一个结点。
反转操作:
- 把当前结点的
next
指针指向前驱结点; - 把前驱结点
pre
移到当前结点cur
上; - 把当前结点
cur
移到之前定义的next
结点处。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
递归
时间复杂度\(O(n)\) 空间复杂度\(O(n)\)
定义tail
结点为reverseList(head)
函数的返回值。当没有next
结点时,返回head
结点。
否则,将当前结点的next
结点的next
指向当前head
结点,head->next
置为空指针nullptr
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|