给你链表的头节点 head ,每 k个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
需求
- k个一组翻转
- 剩下不足k的不变
- 进行节点交换
实现
- 虚拟头节点
代码
class Solution {
/**
* 每 k 个节点一组翻转链表
* @param head 链表头节点
* @param k 每组翻转的节点数
* @return 修改后的链表头节点
*/
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode();
dummy.next = head;
// 统计链表长度
int count = 0;
ListNode curr = head;
while (curr != null) {
count++;
curr = curr.next;
}
// 按k一组翻转链表
ListNode prev = dummy;
curr = head;
while (count >= k) {
ListNode groupPrev = curr;
ListNode groupCurr = curr;
ListNode localPrev = null;
// 翻转当前k个节点
for (int i = 0; i < k; i++) {
ListNode next = groupCurr.next;
groupCurr.next = localPrev;
localPrev = groupCurr;
groupCurr = next;
}
// 将翻转后的子链表重新接入主链表
prev.next = localPrev;
curr.next = groupCurr;
// 将指针移动到下一组
prev = curr;
curr = groupCurr;
count -= k;
}
return dummy.next;
}
}
思绪
七七想吐槽啦!这题思路和七七想的完全不一样啊!!!完全偏离了题目的意思,这道题目也是勉勉强强看懂了,独立写的话还存在一些问题,七七可以克服的,今天就把他搞懂
