首页 > 其他分享 >【力扣】反转链表II

【力扣】反转链表II

时间:2024-02-27 23:33:40浏览次数:26  
标签:pre 力扣 head ListNode cur next 链表 II return

题目描述

image

思路

老样子,还是先用递归试试。
在基本问题中,也就是left == rigth或者left+1 == right时,直接将两个元素调换顺序即可。

我突然发现代码随想录里好像讲过一个用双指针法反转链表的算法。
那道题是把整个链表翻转,
代码如下:

//双指针法
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;
    }
};
//递归法
class Solution {
public:
    ListNode* reverse(ListNode* pre,ListNode* cur){
        if(cur == NULL) return pre;
        ListNode* temp = cur->next;
        cur->next = pre;
        // 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
        // pre = cur;
        // cur = temp;
        return reverse(cur,temp);
    }
    ListNode* reverseList(ListNode* head) {
        // 和双指针法初始化是一样的逻辑
        // ListNode* cur = head;
        // ListNode* pre = NULL;
        return reverse(NULL, head);
    }

};

根据上面的算法得出这题的算法:
代码如下:

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        //先用非递归的算法写
        if(left == right ){
            return head;
        }
        if(head -> next == nullptr){
            return head;
        }

        int i = 1;
        ListNode* tmp;
        
        ListNode* righthead ;
        ListNode* lefthead;
        ListNode* cur = head;
        ListNode* Dummy = new ListNode(0, head);
        ListNode* pre = Dummy;
        while(i< left ){
            pre = pre -> next;
            i++;
        }
        cur = pre -> next;

        lefthead = pre;
        righthead = cur;
        while(cur != nullptr && i <= right){
            tmp = cur -> next;
            cur -> next = pre;
            pre = cur;
            cur = tmp;
            i++;
        }
        righthead -> next = cur;
        lefthead -> next = pre;
        return Dummy -> next;
    }
};

总结

写循环出错的时候很多时候都是循环条件出了问题,这次想了好久的一个报错居然是两个while循环都忘了写循环变量自增。。
这种链表反转的处理方法很实用,以后需要反转链表的时候都可以这样写。

标签:pre,力扣,head,ListNode,cur,next,链表,II,return
From: https://www.cnblogs.com/satsuki26681534/p/18036857

相关文章

  • 2050 并行课程 III
    原题链接题解:拓扑排序+动态规划我们首先根据给定的先修课程关系,构建出一个有向无环图。已知每个结点的时间都是time[i-1]+其入度结点的最大值。最后比较出最大的出度为零的结点的时间code classSolution{public:staticconstintN=5e4+5;inthead[N],Next[N]......
  • day43 动态规划part5 代码随想录算法训练营 1049. 最后一块石头的重量 II
    题目:1049.最后一块石头的重量II我的感悟:复习了昨天的模板是不一样,今天这个我推出来了。哈哈 理解难点:按照昨天的思路,dp[target]里面是能凑出来的最大值。a是另外能凑出来的和。diff是两者的差。听课笔记:我自己先写出的代码:classSolution:deflastStoneW......
  • 代码随想录 day63 下一个更大元素II 接雨水
    下一个更大元素II更下一个最大元素是一样的思路需要处理的是成环数组的模拟过程可以把两个一样的目标数组拼接在一起这样就相当于它成环了或者i变成两倍的范围然后目标下标就变成i%length这样i就会落回目标数组的下标也就是成环了接雨水实际上双指针法可能更......
  • 【力扣】分隔链表
    题目描述思路先想到的一个方法是快慢指针扫描小于x的结点,然后把这些节点插入到慢指针后面去,但是写着写着好像发现这个题也可以用递归来写,后面的若干个结点的子表和整个问题的性质是一样的。普通方法的代码如下://只是大致是这样,这个代码还有一些用例跑不过classSolution{p......
  • 代码随想录算法训练营第二十九天| 491.递增子序列 46.全排列 47.全排列 II
    491.递增子序列题目链接:491.非递减子序列-力扣(LeetCode)思路:一开始一直报访问异常的错误,最后只好参考官网答案,结果竟然是因为我递归参数写错了导致程序一直出问题???(⊙︿⊙)这里去重用的是标记数组,可以用集合unordered_set,但由于本题数据范围比较小,所以我们可以用数组更加高效的......
  • 代码随想录 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.0
    LeetCode:24.两两交换链表中的节点-力扣(LeetCode)思路:第一步:两两交换要考虑循环什么时候退出,当cur指针.next是null是就到尾部了,同理,链表不是奇数就是偶数,cur.next.next是空也是。第二步循环条件判断完了接下来要实现交换,如图所示,按步骤来就好,提前将1,2,3存好,接下来按图......
  • 卡码java基础课 | 3.A+B问题III
    学习内容:if语句关系运算符逻辑运算符break语句continue语句重点归纳:break和continue的用法和区别break:跳出循环continue:直接从头开始执行循环内结构,跳过continue后剩余的代码例题:解:点击查看代码importjava.util.Scanner;publicclassMain{publicstaticv......
  • linux内核链表 --20240225
    提起linux内核链表,首先一定得弄清楚的两个linux内核常用宏offsetof&&container_ofoffsetof宏#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)宏解析:1、size_t在系统中一般指unsignedint,无符号整型2、(TYPE*)0,把0地址强制转换成type结构体类型的指针......
  • UVA12422 (Kengdie) Mua (II) - Expression Evaluator 题解
    题目传送门闲话蒟蒻的第一篇黑题题解!连着花了\(12\)个小时才做出来,打代码\(6\)小时,调试\(6\)小时。一开始怎么编也编不过,直到看到了tiger大神的题解才豁然开朗。思路本题主要是输出函数或运算式子的结果,最重要的就是判断优先级。tiger大神提出了表达式树法和递归......
  • 【力扣】删除排序链表中的重复元素II
    题目描述思路这些链表的有序性使这些操作都不难写。前面在数组的题目里写过跳过重复元素的算法,这个和那个类似,用快慢指针写,但是由于这个是删除重复元素,所以我用了两个相邻的慢指针,左边的慢指针其实是为了保存真正的慢指针的上一个位置。代码如下:classSolution{public:......