1.双指针法
1.1 解题思路
1.我们可以申请两个指针,第一个指针叫 prev,最初是指向 null 的。
2.第二个指针 curr 指向 head,然后不断遍历 curr。
3.每次迭代到 curr,都将 curr 的 next 指向 prev,然后 prev 和 curr 前进一位。
4.都迭代完了(curr 变成 null 了),prev 就是最后一个节点了。
1.2 代码思路
/**
* 双指针迭代
* 我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。
* 第二个指针 cur 指向 head,然后不断遍历 cur。
* 每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。
* 都迭代完了(cur 变成 null 了),pre 就是最后一个节点了。
*
* @param head
* @return 链表
*/
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode tempNode = curr.next;
curr.next = prev;
prev = curr;
curr = tempNode;
}
return prev;
}
1.3 复杂度分析
时间复杂度: O(n),假设 n 是列表的长度,时间复杂度是 O(n)。
空间复杂度: O(1)
2.递归
2.1 解题思路
终止条件是当前节点或者下一个节点==null
在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head
递归函数那句head.next.next = head
2.2 代码思路
2.3复杂度分析
时间复杂度:O(n),假设 n是列表的长度,那么时间复杂度为 O(n)。
空间复杂度:O(n),由于使用递归,将会使用隐式栈空间。递归深度可能会达到 n 层。