【ACWing】35. 反转链表

题目地址:

https://www.acwing.com/problem/content/33/

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

可以用非递归或者递归来写。非递归版本代码如下:

struct ListNode {
    
    
    int val;
    ListNode *next;
    ListNode(int x): val(x) {
    
    }
};

class Solution {
    
    
public:
    ListNode* reverseList(ListNode* head) {
    
    
        ListNode *prev = nullptr, *tmp = nullptr;
        while (head) {
    
    
            tmp = head->next;
            head->next = prev;
            prev = head;
            head = tmp;
        }

        return prev;
    }
};

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1) n n n为链表长度。

递归版本代码如下:

struct ListNode {
    
    
    int val;
    ListNode *next;
    ListNode(int x): val(x) {
    
    }
};

class Solution {
    
    
public:
    ListNode* reverseList(ListNode* head) {
    
    
        if (!head || !head->next) return head;

        ListNode *res = reverseList(head->next);
		head->next->next = head;
		// 注意要把head->next置空,此时head是返回的链表的表尾
		head->next = nullptr;

        return res;
    }
};

时空复杂度 O ( n ) O(n) O(n)

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/115258882