当前位置:   article > 正文

【leedcode.25:Reverse Nodes in k-Group】 每k个节点反转_递归非递归4种解法

reverse nodes in k-group

目录

 

题目:

解法一:递归改变节点连接

解法二:尾插法:

解法三:使用辅助空间,这里使用栈

解法四:递归交换值,不改变链表连接


题目:

 

解法一:递归改变节点连接

           思:1.采用分治思想,从后往前递归,调用递归函数传进去下一个k部分的头结点和k,递归结束是节点为空,此时count 不为0,递归返回最后这部分(不管是否满k个节点)的头结点;
                      2.反转操作是从后往前,倒数第二部分head指向最后一部分head(递归返回),依次在倒数第二部分进行k次反转,return head(反转后的head)

  1. class Solution:
  2. def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
  3. if not head:
  4. return
  5. cur = head
  6. count = k
  7. while count and cur: # 循环结束,cur指向下一段Head;边界情况(1,2,3,4,5,6),第二次调用函数传入head=4,k=3,返回是cur=none,k=3,所以会有第三次调用函数
  8. cur = cur.next
  9. count -= 1
  10. if count:
  11. return head
  12. next_head = self.reverseKGroup(cur, k)
  13. while k:
  14. third = head.next
  15. head.next = next_head
  16. next_head = head
  17. head = third
  18. k -= 1
  19. return next_head

 

 解法二:尾插法:

        思路:1.从前往后,找到第k个节点tail,依次把第一个节点插入到tail后面;

                   2.再连接下一段,初始化head

  1. class Solution:
  2. def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
  3. if not head:
  4. return head
  5. dummy = ListNode(0) # 链表变化后不好找head的可以定义一个dummy结点
  6. dummy.next = head
  7. tail = dummy.next
  8. pre = dummy
  9. while True:
  10. count = k
  11. while count > 1 and tail: # 找到第k个作为tail
  12. tail = tail.next
  13. count -= 1
  14. next_pre = pre.next # 没反转前的第一个节点为反转后的结束节点,即下一次循环时pre更新的位置
  15. if not tail: break # 如果当前循环不存在tail,说明到达最后一部分不满足k个节点
  16. while pre.next != tail: # 当pre的下一个节点不为tail,循环把pre的下一个节点移动到tail后面(移动一个节点到其他节点前或后)
  17. cur = pre.next
  18. pre.next = cur.next
  19. cur.next = tail.next
  20. tail.next = cur
  21. pre = next_pre # 一个k部分的节点移动结束,初始化pre,tail
  22. tail = pre.next
  23. return dummy.next

 

解法三:使用辅助空间,这里使用栈

       思路:

               1.从前往后遍历k个节点先存入栈中,当最后一部分不满足k个节点时,倒数第二部分尾节点指向,最后一部分头结点

               2.出栈依次连接,更新指针

  1. class Solution:
  2. def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
  3. if not head:
  4. return
  5. dummy = ListNode(0)
  6. dummy.next = head
  7. cur = head
  8. p = dummy
  9. while True:
  10. stack = []
  11. while k and cur: # 跳出循环是,cur是第k+1个节点
  12. stack.append(cur)
  13. cur = cur.next
  14. k -= 1
  15. if k > 1:
  16. p.next = cur # 最后一段不满k个节点,则前一部分最后一个节点指向最后一部分的head节点
  17. break
  18. while stack:
  19. p.next = stack.pop()
  20. p = p.next
  21. p.next = cur
  22. return dummy.next

解法四:递归交换值,不改变链表连接

       思路: 每k个部分使用left,right指针,交换值,来完成反转

        TODO:递归交换值,代码满足类似1,2,3,4,5 k=2,3;  但是不满足1,2,3,4  k=4情况

  1. class Solution:
  2. def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
  3. if not head:
  4. return
  5. if k == 1:
  6. return head
  7. def reverse_detailed(cur, k):
  8. nonlocal stop, left, right
  9. if k < 2 or not right:
  10. return
  11. right = right.next
  12. if not right:
  13. return
  14. tail = reverse_detailed(right,k-1)
  15. if not right:
  16. return
  17. if k == 2:
  18. tail = right
  19. if left == right or right.next == left:
  20. stop = True
  21. return tail
  22. if not stop:
  23. left.val, right.val = right.val, left.val
  24. left = left.next
  25. return tail
  26. cur = head
  27. while cur:
  28. if not cur: # 循环更新了cur
  29. return
  30. stop = False
  31. left = right = cur
  32. tail = reverse_detailed(cur, k)
  33. if tail:
  34. cur = tail.next
  35. else:
  36. return head
  37. return head

 

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

闽ICP备14008679号