题目
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题
- 使用递归算法
- 每k个一组进行翻转, 同时将翻转后的最后一个节点指向下一组k个的头结点
- 翻转之前需要先校验一次是否有k个节点, 是否需要进行翻转
- 递归方法返回翻转后的头结点, 代码如下:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (k < 2) {
return head;
}
return reverse(head, k);
}
// 递归方法
private ListNode reverse(ListNode head, int k) {
ListNode cur = head;
// 校验是否可以翻转
for (int i = 0; i < k; i++) {
if (cur == null) {
return head;
} else {
cur = cur.next;
}
}
// 下一组要考察的头节点
ListNode nextReverse = cur;
ListNode pre = null;
cur = head;
ListNode next;
for (int i = 0; i < k; i++) {
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
// 递归进行翻转
head.next = reverse(nextReverse, k);
// pre为翻转后的头结点
return pre;
}
}