解法一:先计算链表的总个数。根据节点总数和当前处理的节点个数进行判断。
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode reverse = new ListNode();
reverse.next = null;
ListNode curr_reverse=reverse, curr_head = head;
// 计算链表总数
int num = 0;
while(curr_head!=null){
num++;
curr_head=curr_head.next;
}
int round = num/k; // 可以轮几次
int n=0;// 现在执行了几个
while(n<round*k){
// 新开启一次reverse
ListNode temp = head.next;
head.next = null;
curr_reverse.next = head;
head = temp;
n++;
while((n)%k!=0){
temp = head.next;
head.next = curr_reverse.next;
curr_reverse.next = head;
head = temp;
n++;
}
// 指向当前轮最后一个
while(curr_reverse.next != null){
curr_reverse = curr_reverse.next;
}
}
// 加入后续不需要reverse的节点
curr_reverse.next = head;
// 删除头节点
reverse=reverse.next;
return reverse;
}
}
注意:
- 当新链表个数n<round(轮数)*k时,表示继续置换;否则表示后续节点不需要置换。
- n%k!=0表示本轮置换还未结束
- 记得加入后续不需要reverse的节点
- 设置没有数据的头节点,后续结果要去掉头节点