206 反转链表

 

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
 

示例 1:


输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

 

 

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;//
先把curr.next放在next里,然后再curr.next=prev.否则指针下一步移动的时候没有指向。
因为开始时指针指向了空
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}

 此图解释了上面代码的注释

 

 力扣  视频讲解

 定义了两个指针 prev与curr 移动。next为变量存储curr.next,使得循环可以进行下去。

 

public:
    ListNode* reverseList1(ListNode* head) {
        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr) {
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }

递归法:

使用递归的前提条件。 

 先head.next.next = head;即让99后的指针指向78.然后让 head.next = null; 为空即断开78 与99之间原来的指针。78为head。返回的为head.next  即为newHead

 

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}

复杂度分析

时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。

空间复杂度:O(n),其中 n是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。


版权声明:本文为weixin_62919611原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。