真的考了~ 搜狐上来手撕两道代码题。第一道就是这个。
迭代写法可以,但是很多注意细节。
递归比较简洁优美。适合装逼,但不适合考试,因为空间复杂度是O(n)。
1. 递归整个链表:https://leetcode-cn.com/problems/reverse-linked-list/
-> 判断递归函数的意义
-> 确定 base case
-> 不要陷入递归!
2. 反转链表前N个结点
def reverseN(head, n):
if n == 1:
successor = head.next
return head
p = reverseN(head.next, n - 1)
head.next.next = head
head.next = successor
return p
3. 反转 m-n 结点
将函数理解成以 head 为初始结点,相对 head 位置为 m 到 n 的翻转。
所以对于 head.next,则相对 head.next 位置为 m-1 到 n-1 的翻转。。。。以此类推。
对于不需要翻转的,只需要返回自身!否则会一直前进到翻转的位置。
其实这题,大不了先 for loop 到第 m 个位置,再翻转即可。转化成翻转 topk 的问题。