最近又把力扣翻出来做,然后这道题又有了新思路,大概就是先全部反转并且计算链表的长度,然后用长度对K取余数,余数的值一个个放到新链表的末尾,其他的分K组放。
比如1,2,3,4,5 的链表 K=3
整个链表反转后就是5,4,3,2,1
余数为2 ,就先拿5 再拿4放到表头 现在新链表就为4,5
然后数K个拿到表头,新链表为 3 2 1 4 5
public ListNode reverseKGroup(ListNode head, int k) {
//新思路,先全部反转并统计链表长度
if(k == 1) return head;
ListNode cur = head;
ListNode pre = null;
int len = 0;
while (cur != null){
len++;
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
// System.out.println(len);
//此时反转后的头为pre
head = pre;
cur = pre;
//然后对K取余
int mod = len % k;
ListNode nowPre = null;
while (mod > 0){
//从第一个开始拿并放到最后
cur = cur.next;
head.next = nowPre;
nowPre = head;
head = cur;
mod--;
}
while (cur != null){
int newK = k;
while (newK > 1){
cur = cur.next;
newK--;
}
ListNode node = cur;
//head = cur;
cur = cur.next;
node.next = nowPre;
nowPre = head;
head = cur;
}
return nowPre;
}