当前位置:   article > 正文

链表内指定区间反转

链表内指定区间反转

题目:

将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。
例如:
给出的链表为 1→2→3→4→5→NULL,m=2,n=4
返回 1→4→3→2→5→NULL
 

数据范围: 链表长度 0< size ≤1000,0<m≤n≤size,链表中每个节点的值满足∣val∣≤1000

要求:时间复杂度O(n) ,空间复杂度O(n)

进阶:时间复杂度O(n),空间复杂度O(1)

示例1:

  1. 输入:{1,2,3,4,5},2,4
  2. 返回值:{1,4,3,2,5}

示例2:

  1. 输入:{5},1,1
  2. 返回值:{5}

解题思路:

这个是在 《单向链表翻转》基础上增加了些难度,指定了区间内的翻转。

首先考虑链表的有效性和m、n 的值合法性;

接着,考虑m 的值,m 可能为1,则要求链表从头开始翻转;

如果m 不为0,那就是将量表分为 3 节,头、中、尾三部分。

代码:

  1. /**
  2. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  3. *
  4. *
  5. * @param head ListNode类
  6. * @param m int整型
  7. * @param n int整型
  8. * @return ListNode类
  9. */
  10. struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
  11. if (m >= n || NULL == head)
  12. return head;
  13. struct ListNode* rHead = head;
  14. struct ListNode* rTail = NULL;
  15. for (int i = 1; NULL != head && i < m; ++i) { //找到rTail和需要翻转的head
  16. rTail = head;
  17. head = head->next;
  18. }
  19. if (NULL == rTail) { //第一个就需要翻转
  20. rHead = NULL;
  21. rTail = NULL;
  22. }
  23. struct ListNode* mHead = NULL;
  24. struct ListNode* mTail = NULL;
  25. struct ListNode* mp = NULL;
  26. for (int i = m; NULL != head && i <= n; ++i) { //进行翻转
  27. mp = head;
  28. head = head->next;
  29. mp->next = mHead;
  30. mHead = mp;
  31. if (NULL == mTail) {
  32. mTail = mp;
  33. }
  34. }
  35. if (NULL != rTail) { //拼接m之前的连接
  36. rTail->next = mHead;
  37. }
  38. if (NULL != mTail) { //拼接n后面的链表
  39. mTail->next = head;
  40. }
  41. if (NULL == rHead) { //如果从第一个开始翻转
  42. rHead = mHead;
  43. }
  44. return rHead;
  45. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/209571
推荐阅读
相关标签
  

闽ICP备14008679号