解法一,借用栈的后进先出完成每个的翻转,时间On 空间Ok,k为栈的借用容量
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if(k<=1||head==null)
return head;
Stack<ListNode> stack = new Stack<>();
ListNode dummy = new ListNode(-1);
dummy.next = null;
ListNode now = dummy;
ListNode p = head;
while(p!=null){
for(int i =0;p!=null&i<k;i++){
stack.push(p);
p=p.next;
}
if(stack.size()==k){
while(!stack.isEmpty()){
now.next = stack.pop();
now = now.next;
now.next = null;
}
}
}
if(!stack.isEmpty()){
while(stack.size()>1)
stack.pop();
now.next = stack.pop();
}
return dummy.next;
}
解法二:模拟,时间On,空间O1
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
int length = 0;
ListNode p = head;
while(p!=null){
length++;
p = p.next;
}
if(k<=1||length<k){
return head;
}
int count = length/k;
ListNode dummy = new ListNode(-1);
ListNode now = dummy;
p = head;
ListNode q = p;
for(int i =0;i<count;i++){
ListNode t = p;
for(int j =0;j<k;j++){
q = p.next;
p.next = now.next;
now.next = p;
p = q;
}
now = t;
}
if(p!=null)
now.next = p;
return dummy.next;
}
}