Code Top -- 01 反转链表

反转链表

Posted by OUC_LiuX on March 28, 2022

from CodeTop, Leetcode, 206. 反转链表
阿里云一面题。

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

迭代做法(经典题,背过即可)

双指针,后一个节点 b 指向前一个节点 a。一次往后转移一位,由于后指针 next 值改变,需要使用一个临时变量存储后一指针。
迭代完成尾节点指针为 a,将头指针 next 指空,返回 a 即可。

ListNode* reverseList(ListNode* head){
    if (!head || !head -> next) return head;
    auto a = head, b = head -> next;
    while(a && b){
        auto c = b -> next;
        b -> next = a;
        a = b;
        b = c;
    }
    head -> nullptr;
    return a;
}

递归做法(经典题,背过即可)

将递归函数看做黑箱,可以返回翻转后的新的头结点,而我们需要做的只是将传入的头结点,也就是调用递归后的尾节点指向他该指向的位置即可。
不理解没关系,背下来,每天写一遍就理解了。

ListNode* reverseList(ListNode* head){
    if (!head || !head -> next) return head;
    auto tail = reverseList(head->next);
    head -> next -> next = head;
    head -> next = nullptr;
    return tail;
}