算法面试题-链表反转变形(golang实现)

题目详情:

给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间为一组进行逆序,并且从链表的尾部开始组起,头部剩余节点数量不够一组的不需要逆序。(不能使用队列或者栈作为辅助)

例如: 链表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一组。调整后:1->2->5->4->3->8->7->6->null。其中 1,2不调整,因为不够一组。

思路分析:

1. 链表反转之前也做过类似的题目。该题目在此基础上增加了难度,且不能使用队列或者栈作为辅助的数据结构,于是我们可以考虑使用递归法来思考这道题目:这里有篇比较好的文章详细介绍了递归法

2. 既然决定使用递归法,那就按照文章描述的三要素去思考一下这个问题了:

2.1 这个函数需要做什么?答案很简单,这个函数就是为我们将一个单链表按照一定的规则排好序。那么不考虑其他条件的前提下可以大概写出最初的函数原型:

type node struct {
	val int
	next *node
}

// 传入原始的单链表头; 输出处理好的链表头
func handle(head *node) (*node) {
    return nil
}

2.2 函数结束的条件是什么?根据题目可知,分组是从尾节点开始的,那么最初的起点也只能从尾节点开始。然后我们可以大致修改一下代码:

type node struct {
	val int
	next *node
}

// 传入原始的单链表头; 输出处理好的链表头
func handle(head *node) (*node) {
    if head.next != nil {
        // 这里返回的内容需要做进一步的思考
        return nil
    }
    return nil
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值