原题描述
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例:
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
代码
@SuppressWarnings("all")
class Solution5 {
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public ListNode reverseKGroup(ListNode head, int k) {
if(k == 1){
return head;
}
ListNode hair = new ListNode(0);
hair.next = head;
ListNode pre = hair;
while (head != null) {
ListNode tail = pre;
for (int i = 0; i < k; i++) {
tail = tail.next;
if (tail == null) {
return hair.next;
}
}
ListNode next = tail.next;
ListNode[] reserve = reserve(head, tail);
head = reserve[0];
tail = reserve[1];
pre.next = head;
tail.next = next;
pre = tail;
head = tail.next;
}
return hair.next;
}
public ListNode[] reserve(ListNode head, ListNode tail) {
ListNode prev = tail.next;
ListNode p = head;
while(prev != tail){
ListNode next = p.next;
p.next = prev;
prev = p;
p = next;
}
return new ListNode[]{tail,head};
}
}