剑指 Offer 24-反转链表c++

本文探讨了两种常见的链表反转方法:双指针法和递归法。双指针法中,通过定义pre和cur指针,逐步更新节点连接,避免了空指针错误。而递归法利用栈的特性,巧妙地实现了链表的反转。两种方法的时间复杂度均为O(n),但递归法额外消耗了O(n)的空间。
摘要由CSDN通过智能技术生成

题目描述

在这里插入图片描述

解法 双指针法

定义一个 pre指针指向上一个结点cur指针指向当前节点,利用临时指针tmp=cur->next不断更新cur
错误案例

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

    }
};

觉得题目简单草草应付的代码
没有考虑到tmp可能是空指针,导致空指针报错,同时导致反转结束时得单独处理。
改进:
将pre的初始值定义为空指针,cur定义为head,当cur为空时说明pre到达头节点,改进代码为

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

在这里插入图片描述时间复杂度O(n),空间复杂度O(1)

解法二 递归法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == NULL || head -> next == NULL ) {
            return head;
        }
        ListNode *tmp = reverseList(head -> next);
        head -> next -> next = head;
        head -> next = NULL;
        return tmp;
    }
};
  head -> next -> next = head 可以让当前节点的下一个节点的next指针指向自己
  利用递归的栈的特性省去一个pre指针。

妙在往回递归之后,tmp一直都是最后一次的head。
在这里插入图片描述
时间复杂度O(n) ,空间复杂度O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值