牛客网在线编程第三题——链表中的节点每k个一组翻转

 9fbc1997ad064f08b9cfef2ac004766f.png

这道题被爱学习的你看到了,很棒!那今天就花十五分钟的时间,一起来看下链表中的节点每k个一组翻转。来说下解题思路:

这道题和第二道题实现链表区间反转是类似的思想。在这里可以用头插法来写,和前面说到抽书法类似。

首先定义虚拟头节点dummy,固定好头节点位置,然后只关心dummy.next,然后分段使用头插法将链表反序,pre是每一段链表前面一个节点(在这里pre就指的是dummy),负责衔接。temp指cur.next(cur的下一个节点)。cur指当前每一段小链表的第一个节点。k个元素,就需要k-1次反转,使用for循环即可。

下面

举例说明

ff7ce0c1a7b245a9b05cca00655f8a4b.png

12f19c5c8240435ab26ad325ae3c9afd.png

代码实现
import java.util.*;
public class Solution {
    public ListNode reverseKGroup (ListNode head, int k) {
        if(head==null||head.next==null||k==1) return head;
        ListNode dummy = new ListNode(0); /*new 一个虚拟头节点*/
        dummy.next = head;
        int length = 0;
        ListNode pre = dummy,
                 cur = head,
                 temp = null;
        while(head!=null){
            length++;
            head = head.next;
        }
        //分段使用头插法将链表反序
        for(int i=0; i<length/k; i++){
            //pre作为每一小段链表的头节点,负责衔接
            for(int j=1; j<k; j++){
                temp = cur.next;
                cur.next = temp.next;
                //相当于头插法,注意:
                //temp.next = cur是错误的,temp需要连接的不是前一节点,而是子序列的头节点
                temp.next = pre.next;
                pre.next = temp;
            }
            //每个子序列反序完成后,pre,cur需要更新至下一子序列的头部
            pre = cur;
            cur = cur.next;
        }
        return dummy.next;
    }
}

ps:第二道题的抽书法 放在这了,大家也可以参照理解:

70bdc0b7e5534013800ede4f9fcee453.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值