《LeetCode之每日一题》:136.反转链表

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:136.反转链表相关的知识,希望对你有一定的参考价值。

反转链表


题目链接: 反转链表

有关题目

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


示例 3:

输入:head = []
输出:[]
提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。
你能否用两种方法解决这道题?

题解

法一:迭代
代码一:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* newHead = nullptr;
        ListNode* cur = head;
        
        while(cur){
            ListNode* temp = cur;            
            cur = cur->next;
            temp->next = nullptr;
            if (newHead == nullptr){
                newHead = temp;
            }
            else {
                temp->next = newHead;
                newHead = temp;
            }
        }
        return newHead;
    }
};

时间复杂度:O(N)
空间复杂度:O(1)
代码二:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;
        ListNode* p = nullptr;
        while(cur){
            ListNode* temp = cur->next;
            cur->next = p;
            p = cur;
            cur = temp;
        }
    return p;
    }
};

时间复杂度:O(N)
空间复杂度:O(1)

以上是关于《LeetCode之每日一题》:136.反转链表的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:287.反转链表

每日一题 | 曾被反转链表支配的恐惧

每日一题 | 曾被反转链表支配的恐惧

Java算法 每日一题 编号206:反转链表

Java算法 每日一题 编号206:反转链表

Java算法 每日一题 编号206:反转链表