反转链表
完全反转
leetcode(206)
双指针 单向迭代
时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次
空间复杂度:O(1)
/** 时间O(n) 空间O(1)
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode curr = head;
while(curr != null){
ListNode next = curr.next;
// 保存下一位
curr.next = pre;
//1 当前的下一位指向前面的
pre = curr;
//2 pre移动到下一位
curr = next;
//3 curr移动到下一位
}
return pre;
}
}
递归
reverseList(head) :将head为起点的链表反转,然后返回反转后的头结点。
时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作
空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层
/*
*时间O(n) 空间O(n)
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode result = reverseList(head.next);
head.next.next = head;
//
head.next = null;
return result;
}
}
reverseList: head=1
reverseList: head=2
reverseList: head=3
reverseList:head=4
reverseList:head=5