目录
前言:
生活是蜿蜒在山中的小径,坎坷不平,沟崖在侧。摔倒了,要哭就哭吧,怕什么,不心装模作样!这是直率,不是软弱,正因哭一场并不影响赶路,反而能增添一份留意。山花烂漫,景色宜人,如果陶醉了,想笑就笑吧,不心故作矜持!这是直率,不是骄傲,正因笑一次并不影响赶路,反而能增添一份信心。
代码:
public class method{
public ListNode ReverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode res = ReverseList(head.next);
head.next.next = head;
head.next = null;
return res;
}
}
解题思路:
递归上来就先写终止条件:如果head为空或者head.next为空,返回head
(1)新头结点 res 指向尾结点,此处进入递归,递归一直到遍历到尾结点时才会返回
(2)每一层递归,该层递归中的 head 会让下一个节点指向自己,head.next.next = head;然后head自己指向空。以此达到反转的目的。
(3)返回新链表的头结点newHead
复杂度分析:
时间复杂度O(N):N表示链表长度
空间复杂度O(N):递归机制的实现需要借助于栈,该程序中递归栈的深度为N-1,所以空间复杂度为线性。
算法思想二:双指针迭代
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
# write code here
# 空链表或只有一个节点得链表
if not pHead&nbs***bsp;not pHead.next:
return pHead
cur = pHead
pre = None
# 循环移动curent和pre,移动过程中反转 curent.next=pre
while cur:
next_node = cur.next
cur.next = pre
pre = cur
cur = next_node
return pre
解题思路:
(1)定义两个指针: pre 和 cur ;pre 在前 cur 在后。
(2)每次让 pre 的 next 指向 cur ,实现一次局部反转
(3)局部反转完成之后, pre 和 cur 同时往前移动一个位置
(4)循环上述过程,直至 pre 到达链表尾部
复杂度分析:
时间复杂度O(N):N表示链表长度,双指针一次遍历
空间复杂度O(1):常数大小空间指针