用递归,一开始有很多思路和尝试,感觉边脚细节处理还是不容易
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 tail = head;
for(int i = 0; i< k; i++){
if(tail==null) return head;
tail = tail.next;
}
ListNode pre = null;
ListNode cur = head;
//把这次的反转
while(cur!=tail){
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
head.next = reverseKGroup(tail,k);
return pre;
}
}
在力扣中提交(力扣这题竟然是困难题)
法2
不用递归
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 res = new ListNode(-1);
res.next = head;
ListNode pre = res;
ListNode end = res;
while(end.next!=null){
for(int i=0; i<k&&end!=null; i++) end=end.next;
if(end==null) break;
ListNode start = pre.next;
ListNode next = end.next;
end.next = null;
pre.next = reverse(start);
start.next=next;
pre = start;
end = pre;
}
return res.next;
}
public ListNode reverse(ListNode head){
ListNode pre = null;
ListNode cur = head;
//反转
while(cur!=null){
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
}