前段时间帮对象做360笔试题时,遇到一个没怎么想明白的编程题,直到今天刷力扣遇到了相似的k个一组翻转链表后,想着在做一下那天的编程题,就想着记录一下遇到的难点。


力扣题如下图所示:

360原创题如下:

代码如下:

class Solution {

public:

pair<ListNode*,ListNode*> myReverse(ListNode* head,ListNode* pre1){

ListNode* prev = pre1->next;

ListNode* p = head;

while(pre1!=prev){

ListNode* temp = p->next;

p->next=prev;

prev = p;

p = temp;

}

return {pre1,head};

}    //head,pre1是原链表的位置,注意注意!

ListNode* reverseKGroup(ListNode* head, int k) {

if(head->next->next==NULL) return head;

ListNode* hair = new ListNode(0);

hair->next = head;            // //返回的头结点

ListNode* pre1 =head;         //翻转的尾节点

ListNode* cur = head->next;  //翻转尾节点的下一个节点

ListNode* pre2 = head;        //固定每个头结点的上个节点

while(head->next){

while(cur->next!=NULL && (pre1->val==cur->val || cur->val==cur->next->val){

cur = cur->next;

pre1 = pre1->next;

}

head = cur;

pre2 = pre1;

while(cur->next!=NULL && pre1->val!=cur->val && cur->val!=cur->next->val){

pre1 = cur;

cur = cur->next;

}

if(cur->next ==NULL && pre2 != pre1){    //最后节点翻转的情况

pre1 = cur;

cur =NULL;

pair<ListNode*,ListNode*> result = myReverse(head,pre1);

head = result.first;

pre1 = result.second;

pre2->next = pre1;

head->next = cur;

}

else if(pre2 == pre1){       //最后节点不翻转的情况

return hair->next;

}

else if(cur->next!=NULL){       //中间节点翻转的情况

pair<ListNode*,ListNode*> result = myReverse(head,pre1);

head = result.first;

pre1 = result.second;

pre2->next = pre1;

head->next = cur;

pre1 = cur;

cur = cur->next;

} }  }

return hair->next;

}

};

链表题虽然想法不难实现,但一些细节、边界问题还是很容易出现错误,这里特别是处理右边界的时候,弄的我很迷糊,一开始代码还是比较简洁的,加了很多测试案例后发现原代码行不通,再次基础上又添添补补,导致代码比较冗长,也算是一次心酸的添补史吧!剪枝的操作日后在想吧,哪位大佬有更简洁直观的代码可以分享我一下,感激不尽~

由力扣K 个一组翻转链表到360原创题相关推荐

  1. 力扣——k个一组翻转链表

    给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这个链表: ...

  2. 链表经典题:K个一组翻转链表

    题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...

  3. 25. K 个一组翻转链表

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

  4. 20200329:K 个一组翻转链表(leetcode25)

    K 个一组翻转链表 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 注意题目里的常数的额外空间的要求,意味着不可以使用栈之类的数据结构. 这道链表题实际就是上一道的进阶版,指定每k个进行翻转 ...

  5. LeetCode--第25题K个一组翻转链表

    LeetCode–第25题K个一组翻转链表 题目描述 解决方案–C语言 主体是用递归的办法.递归三要素: 1.向上返回什么:一个处理好的子链表 2.返回条件是什么:要么是处于好了子链表,要么是因长度小 ...

  6. 哔哩哔哩2020校园招聘 - K个一组翻转链表 一年中的第几天

    1.K个一组翻转链表 题目描述: 给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例 : 给定这个链表:1-&g ...

  7. 清晰易懂的“K个一组翻转链表”解法

    题目来源:Leetcode K个一组翻转链表 一.题目 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍 ...

  8. K 个一组翻转链表(递归,Kotlin)

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

  9. Leetcode-递归/反转链表模板-25. K 个一组翻转链表

    题目25. K 个一组翻转链表: 题解: 模拟 以K个为一组,进行常规反转,重点是要保留反转前的头节点,以及第K+1个节点,将其反转之后连接起来 代码: /*** Definition for sin ...

最新文章

  1. 能和LoadRunner匹敌的VS2010/2012Web负载测试
  2. 初识 ElasticSearch,一个上天下地的搜索引擎 No.158
  3. 计算机ip地址删除,Windows 8 或 Windows Server 2012 中删除一个 IP 地址时,不正确地删除活动路由表项...
  4. {在头值中找到无效的字符。} 发email的时候 遇到这个问题 老师解决
  5. SpringBoot热加载实现与类加载浅谈
  6. mysql 的client_mysql(一)-客户端Client相关
  7. 23 岁创业,28 岁成为福布斯亚洲青年领袖,这个“刷脸的男人”有点牛
  8. python super详解_python中super()详解
  9. 030_磁盘调度策略比较
  10. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明
  11. [转]AndroidManifest.xml文件详解
  12. Flutter 常用的按钮组件
  13. 网易云课堂Python Flask框架全栈开发
  14. 向量空间 内积空间 欧氏空间 希尔伯特空间
  15. 血液透析机最全学习手册
  16. 用word模板制作幻灯片
  17. Expected binary or unicode string, got 3
  18. pb 如何导出csv_用问卷网做问卷调查 如何导出数据报表?
  19. 手写多位数字识别器实现 (转载请注明出处!)
  20. Cat Party (Easy Edition)

热门文章

  1. Java学到什么程度可以找工作?这10点赶紧自查!
  2. layui 审核按钮 及 代码实现
  3. selenium无法定位126邮箱
  4. 流量分析方面的公开数据集
  5. AWS安装WordPress更改IP地址后无法访问的解决办法
  6. 清晰架构(Clean Architecture)的Go微服务: 程序容器(Application Container)
  7. python opencv-特征检测与描述
  8. matlab画正弦函数图
  9. floorplan阶段用到的物理单元
  10. 飞书自定义机器人集成ChatGPT,含java源码开源