链表问题2——k个一组反转链表

链表问题2——k个一组反转链表

在这里插入图片描述

一.分析问题

如果我们对这个链表调用reverseKGroup(head,2),即以2个节点为一组反转链表:
在这里插入图片描述
后面节点的处理实际上也是一条链表,且是长度更短的链表。这就是子问题。

在这里插入图片描述
这就可以直接递归调用reverseKGroup(head,2)。

具体的算法流程:
1.先反转以head为开头的k个元素
在这里插入图片描述
2.将第k+1个元素作为head递归调用reverseKGroup函数。
在这里插入图片描述
3.将上述两个过程连接起来。
在这里插入图片描述最后一点值得注意的是,递归函数都有个 base case,对于这个问题是:如果最后的元素不足 k 个,就保持不变。这就是 base case。

二.代码实现

[反转以a为头结点的链表] 迭代方法实现:

ListNode reverse(ListNode a){
	ListNode pre,cur,nxt;
	pre =null;cur=a;nxt=a;
	while(cur!=null){
		nxt =cur.next;
		cur.next =pre;
		pre = cur;
		cur=nxt;
	}
	return pre;
}

反转以a为头结点的链表实际上就是反转a到null之间的节点,现在要反转a到b之间的,只需要改一下终止条件就行while(cur!=b)

/** 反转区间 [a, b) 的元素,注意是左闭右开 */
ListNode reverse(ListNode a, ListNode b) {
    ListNode pre, cur, nxt;
    pre = null; cur = a; nxt = a;
    // while 终止的条件改一下就行了
    while (cur != b) {
        nxt = cur.next;
        cur.next = pre;
        pre = cur;
        cur = nxt;
    }
    // 返回反转后的头结点
    return pre;
}

现在有了反转部分链表的功能,接下来就按照之前的算法实现即可:

ListNode reverseKGroup(ListNode head,int k){
	if(head == null) return null;
	//区间[a,b)包含k个待反转元素
	ListNode a,b;
	a=b=head;
	//这里的for循环的作用是获得b的位置
	for(int i=0;i<k;i++){
		//base case 不足k个,不需要反转
		if(b==null) return head;
		b=b.next;
	}
	//反转前k个元素
	ListNode newhead = reverse(a,b);
	//递归反转后续链表并连接起来
	a.next = reversKGroup(b,k);
	return newhead;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值