C++程序 分组反转链表 – 1
给定一个链表,编写一个函数来反转每k个节点的链表(其中k是函数的输入)。
例子:
输入 : 1->2->3->4->5->6->7->8->NULL,K = 3
输出 : 3->2->1->6->5->4->8->7->NULL
输入 : 1->2->3->4->5->6->7->8->NULL,K = 5
输出 : 5->4->3->2->1->8->7->6->NULL
算法: 反转 (head, k)
- 反转第一个大小为k的子列表。反转时跟踪下一个节点和上一个节点。将指向下一个节点的指针设为 next ,将指向上一个节点的指针设为 prev 。请参见这篇文章中的反转链表
- head- >next = reverse(next, k) ( 对线路的其余部分进行递归调用,并将两个子列表链接在一起 )
- 返回 prev ( prev 成为列表的新头(请参见这篇文章的迭代方法的图解)
下面的图像显示了反转函数的工作原理:
下面是上述方法的实现:
输出:
复杂度分析:
- 时间复杂度: O(n)。 只需要对列表进行一次遍历,且列表有n个元素。
- 空间复杂度: O(n/k)。 每个大小为n的链表,在递归过程中需要进行n/k或(n/k)+1次调用。