题目详情:
给定一个单链表的头节点 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
}