题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
解题思路:
递归法
- 递归参数,剩余的链表节点和参数k
- 递归终止条件:
- 如果当前链表的头节点为空 则返回null。
- 如果当前链表的头节点不为空,则依次对每个节点反转链表。
这时可能有两种情况:
- 如果反转完链表发现当前链表节点数量小于k,则再次反转链, 返回值为当前节点的头节点。
- 如果当前链表节点数量大于等于k,则反转完k个链表之后,继续递归剩余的链表,并且当前返回值为本次反转链表之后的的第一个节点。
JAVA代码实现如下:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if(head==null)return null;
ListNode p=head;
ListNode pre=null;
int count=1;//遍历过的节点数
while(p!=null){
ListNode node=p.next;
p.next=pre;
pre=p;
p=node;
count++;
if(count-1==k)//减1是因为当前节点即第count个节点为下一个区间链表的头节点。
break;
}
if(count-1<k){//count减1小于k说明最后剩余的节点个数小于k(不然上面的while循环不会停止)
while(pre!=head){
ListNode node=pre.next;
pre.next=p;
p=pre;
pre=node;
}
return pre;
}
head.next=reverseKGroup(p,k);
return pre;
}
}