25. K 个一组翻转链表
思路
遍历链表–>如果每少于k个–>翻转操作
–>如果每到k个–>递归
总结
其实常规思路是 每k个进行一个翻转,然后把所有的翻转结果进行一个拼接,但是效率较低。用递归的思路则很不错。
具体实现
public ListNode reverseKGroup(ListNode head, int k) {
return swapPairsPerIntNum(head, k);
}
private ListNode swapPairsPerIntNum(ListNode head, int n) {
if(n == 1){
return head;
}
ListNode temp = new ListNode(0,head);
ListNode result = new ListNode(), oldNext,tail = null,current;
int index = 0;
while(temp.next != null){
index++;
current = new ListNode(temp.next.val);
if(index == 1){
tail = current;
}
if(index <= n){
oldNext = result.next;
result.next = current;
result.next.next = oldNext;
temp = temp.next;
}else{
boolean hasNext = this.checkNum(temp.next, n);
if(hasNext){
tail.next = swapPairsPerIntNum(temp.next,n);
}else{
tail.next = temp.next;
}
break;
}
}
return result.next;
}
private boolean checkNum(ListNode node, int k){
ListNode temp = new ListNode(-1,node);
int index = 0;
while(temp.next != null){
index++;
temp = temp.next;
if(index > k){
break;
}
}
return index >= k;
}