25. K 个一组翻转链表

题目链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/

解题思路:先解决怎么翻转一段链表,然后在解决这道题。

  1. 翻转一个链表reverse(head,tail)

比如将链表1->2->3->4进行翻转,则翻转后的链表为:1<-2<-3<-4。

思路:从前往后遍历,依次将当前节点的next指针指向前一个节点,可以使用prev记录上一个节点

  1. 假设要翻转一段链表的头节点为head,尾节点为tail。遍历链表,在进行翻转的时候,需要记录当前节点current的前驱prev,因为翻转的链表head之前和tail之后还可能有节点,翻转后原来的tail会成为新的头节点,head会成为新的尾节点,即head.next需要连接原来的tail.next,所以初始时,可以令prev=tail.next

  1. 在遍历的时候只要前驱prev不等于尾节点tail,就循环翻转:

  1. 首先记录下一个节点next=current.next

  1. 令当前节点的next指向前驱prev,current.next=prev

  1. 更新prev=current

  1. 遍历下一个节点,current=current.next

  1. 遍历结束后,当前链表已经成功翻转,并且head成为尾节点,tail成为头节

  1. K个一组进行翻转

  1. 可以在头节点前新建一个哑元节点newHead,令newHead.next=head,这样,头节点就不需要额外处理判断

  1. k个一组进行翻转时,需要将这k个反转后的链表重新和前后节点连接上,因此,需要记录开始翻转的节点的前驱prev,初始时prev=newHead

  1. 循环遍历,直到head==null(遍历到最后一个节点)

  1. head为要翻转的链表的第一个节点,tail为要翻转的链表的最后一个节点

  1. 如果链表长度小于k,不需要翻转,直接返回newHead.next

  1. 记录下一次需要翻转节点的头节点,next=tail.next

  1. 使用方法一中的步骤,翻转head和tail之间的链表,翻转后tial为新的头节点,head为新的尾节点

  1. 将翻转后的链表和前面的节点连接上,即prev.next=tail

  1. 将翻转后的链表和后面的节点连接上,即head.next=next

  1. 更新前驱prev=head(上一次翻转后链表的尾节点)

  1. 更新下一次要翻转链表的头指针,head=next

AC代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值