LeetCode 206. Reverse Linked List

题意:使用循环或递归将链表翻转。
解题方法:
1、循环,定义pre指针和next指针,pre指针指向已翻转的链表,head指针指向未翻转的链表,next指针在翻转节点时储存下一个节点的地址,直到head为空指针,则所有链表已翻转。
复杂度:时间复杂度:O(N),空间复杂度:O(1)。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* pre = NULL;
        while (head) {
            ListNode* next = head->next;
            head->next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
};

2、递归,递归结束条件:当head指向NULL或head->next指向NULL时,返回head,就是指向链表最后一个节点的指针。递归函数返回后,回到上一级递归函数,此时的head为指向最后一个节点的上一个节点的指针,将最后一个节点的next指针指向该节点,讲该节点的next指向NULL,完成最后一个节点的翻转。然后继续向上一级函数递归,依次翻转节点,直到最初的head指针的next指向NULL,完成全链表的翻转。
复杂度:时间复杂度:O(N),空间复杂度:O(1)。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == NULL || head->next == NULL)
            return head;
        ListNode* ans = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return ans;
    }
};

你可能感兴趣的:(LeetCode 206. Reverse Linked List)