leetcode25. K 个一组翻转链表

举报
兔老大 发表于 2021/04/30 04:47:48 2021/04/30
【摘要】 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 说明 :...

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

思路:找k链表的两头,反转中间,并且操作连接部分的各种指针。代码有详细注释

 


  
  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode reverseKGroup(ListNode head, int k) {
  11. ListNode dummy = new ListNode(0);
  12. dummy.next = head;
  13. ListNode pre = dummy;
  14. ListNode end = dummy;
  15. while (end.next != null) {
  16. //1、找k个
  17. for (int i = 0; i < k && end != null; i++) end = end.next;
  18. //2、不足k个按原顺序,不用改变
  19. if (end == null) break;
  20. //3、记录反转链表的起点
  21. ListNode start = pre.next;
  22. //4、记录反转链表结尾的下一个节点
  23. ListNode next = end.next;
  24. //5、把反转链表的next赋值为null,方便调用reverse()
  25. end.next = null;
  26. //6、前节点的下一个节点是反转后的新头
  27. pre.next = reverse(start);
  28. //7、反转后的链表尾(之前的翻转起点)的next赋值为之前第4步记录的next
  29. start.next = next;
  30. //8、更新下一个要翻转k链表的前一个节点(也就是本次反转后的末尾)
  31. pre = start;
  32. //9、赋值end,为下一次循环的第一步做准备
  33. end = pre;
  34. }
  35. return dummy.next;
  36. }
  37. //翻转标准链表(最后节点的next是null),返回新链表的头
  38. private ListNode reverse(ListNode head) {
  39. ListNode pre = null;//前节点
  40. ListNode curr = head;//操作的节点
  41. while (curr != null) {
  42. //记录本次节点的下一个节点
  43. ListNode next = curr.next;
  44. //赋值本次节点的next为前节点
  45. curr.next = pre;
  46. //更新前节点和操作节点
  47. pre = curr;
  48. curr = next;
  49. }
  50. return pre;
  51. }
  52. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104329354

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。