当前位置:   article > 正文

LeetCode刷题(python版)——Topic25K 个一组翻转链表

LeetCode刷题(python版)——Topic25K 个一组翻转链表

一、题设

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

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

二、基本思路

1.当成数组来直接进行交换,再在最后存入链表中。

2.借助栈,将k个数据分批进栈出栈再链接,一边顺序遍历链表,一边存入栈中,值得注意的是循环的出口条件以及处理在最后一趟的数据不能完全存入栈中的可能性(不够k)

三、代码实现

1.way01(超时间限制)

  1. def reverseKGroup(self, head, k):
  2. def reverse(left,right,list):
  3. while left<right:
  4. temp = list[left]
  5. list[left] = list[right]
  6. list[right] = temp
  7. res = ListNode(999)
  8. start = res
  9. res.next = None
  10. list1 = []
  11. while head:
  12. list1.append(head.val)
  13. head = head.next
  14. for i in range(len(list1)):
  15. if (i+1) % k == 0:
  16. reverse(i-k,i,list1)
  17. for item in list1:
  18. node = ListNode(item)
  19. node.next = res.next
  20. res.next = node
  21. return start

2.栈

  1. def reverseKGroup(self, head, k):
  2. # dummy为结果数组
  3. dummy = ListNode(-1)
  4. p = dummy
  5. while True:
  6. tmp = head
  7. # 栈用于先进后出
  8. vector = []
  9. # 每次倒计数
  10. count = k
  11. while count and tmp:
  12. vector.append(tmp)
  13. tmp = tmp.next
  14. count -= 1
  15. # 栈内无数据,链表未结束
  16. # 即最后一趟
  17. if count:
  18. p.next = head
  19. break
  20. while vector:
  21. p.next = vector.pop()
  22. p = p.next
  23. # 每倒完一次,与剩下的相连
  24. p.next = tmp
  25. head = tmp
  26. return dummy.next

四、效率总结

1.way01

 2.way02

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

闽ICP备14008679号