手撕LeetCode(2)
递归思维:K个一组反转链表
利用迭代的方法反转列表。
具体问题
分析问题
反转分为两部进行。
第一步:先反转以head开头的K个元素。
第二步:将K+1个元素作为head进行递归调用reverseKGroup函数。
最后的操作:将以上两步的结果连结在一起。
注意:递归时的base case,当不足为K个的时候,就保持不变。
具体实现
首先实现整个链表的反转。
ListNode reverse(ListNode a){
ListNode pre,cur,nxt;
pre=null;
cur=a;
nxt=a;
while(nxt!=null){
nxt=cur.next;
cur.next=pre;
pre=cur;
cur=nxt;
}
return pre;
}
反转以a为头节点,反转就是a到null的范围与反转整个链表的结果相同。那么对于本问题,将代码中的null改为b。
ListNode reverseKGgroup(ListNode head,int k){
if(head==null) return null;
ListNode a,b;
a=b=head;
for(int i=0; i<k; i++){
//不足k个不用反转
if(b==null) reutrn head;
b=b.next;
}
ListNode newhead=reverse(a,b);
a.next=reverseKGgroup(b,k);
return newhead;
}
刷题使我快乐!