将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
数据范围: 0≤n≤2000 ,1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1),时间复杂度 O(n)
例如:
给定的链表是 1→2→3→4→5
对于 k=2 , 你应该返回 2→1→4→3→5
对于 k=3 , 你应该返回 3→2→1→4→5
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
if (head==null)return head;
ListNode pre = dummyNode;
ListNode leftNode = head;
ListNode rightNode = leftNode;
for (int a = 0; a < k - 1; a++) {
rightNode = rightNode.next;
}
while (rightNode != null) {
ListNode cur = rightNode.next;
pre.next = null;
rightNode.next = null;
reverseLinkedList(leftNode);
//if(head==head)return rightNode;
pre.next = rightNode;
leftNode.next = cur;
for (int a = 0; a < k; a++) {
pre = pre.next;
}
leftNode = pre.next;
rightNode = leftNode;
for (int a = 0; a < k - 1; a++) {
if(rightNode==null)break;
rightNode = rightNode.next;
}
}
return dummyNode.next;
}
public void reverseLinkedList(ListNode Head) {
ListNode left = Head;
ListNode pre = null;
ListNode cur_next = null;
while (left != null) {
cur_next = left.next;
left.next = pre;
pre = left;
left = cur_next;
}
}
}