代码随想录算法训练营第三天|206.反转链表

题目链接/文章讲解/视频讲解:代码随想录

思路:双指针,temp放当前操作指针cur的下一个指针,pre放cur的上一个指针;先定义pre为NULL,然后cur为head,定循环的停止条件,然后每次循环都是先保存cur->next在temp,让cur->next指向pre,然后先把pre移动到现在的cur,cur移动到temp里存在cur-next。

代码:

class Solution {

public:

    ListNode* reverseList(ListNode* head) {

        ListNode* temp; // 保存cur的下一个节点

        ListNode* cur = head;

        ListNode* pre = NULL;

        while(cur) {

            temp = cur->next;  // 保存一下 cur的下一个节点,因为接下来要改变cur->next

            cur->next = pre; // 翻转操作

            // 更新pre 和 cur指针

            pre = cur;

            cur = temp;

        }

        return pre;

    }

};

错误原因:

1.要注意while的判断条件是当前操作指针指向了空节点也就是尾结点的后面,这个时候才不需要把当前节点的next转向pre。

2.先移动pre再移动cur;

递归的思路去做的话,就是把pre和cur的初始化转为实参赋给函数形参的过程;

然后调用的函数去移动pre和cur

class Solution {

public:

    ListNode* reverseList(ListNode* head) {

        // 和双指针法初始化是一样的逻辑

        // ListNode* cur = head;

        // ListNode* pre = NULL;

        return reverse(NULL, head);

    }

    ListNode* reverse(ListNode* pre,ListNode* cur){

//判断是否进行翻转,如果是cur已经指向尾结点的下一个节点,那就不需要翻转了。

        if(cur == NULL) return pre;

        ListNode* temp = cur->next;//先存下cur->next到temp里

        cur->next = pre;//把cur->next指向pre;

        // 可以和双指针法的代码进行对比,如下递归的写法,其实就是移动了pre和cur

        // pre = cur;

        // cur = temp;

        return reverse(cur,temp);

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值