第一种:循环o(1)的时间复杂度
public ListNode reverseKGroup (ListNode head, int k) { if(head==null||head.next==null) return head; int cnt=0; ListNode h=head; ListNode pre=new ListNode(0); ListNode p=pre; // write code here while (head!=null){ ListNode temp=head.next; cnt++; //每k个节点的时候 就翻转 if(cnt%k==0){ reverse(h,head,pre); pre=h; pre.next=temp; h=temp; } head=temp; } if(cnt<k) return h;//不足k个的时候直接返回头节点 return p.next; } private void reverse(ListNode h, ListNode head,ListNode pre) { ListNode s=h; while (s!=head){ ListNode temp=s.next; s.next=pre.next; pre.next=s; s=temp; } head.next=pre.next; pre.next=head; }
第二种:递归写法
public ListNode reverseKGroup (ListNode head, int k) { if(head==null||head.next==null) return head; // write code here //在不足k的时候 int res = 0; ListNode h=head; while(head!=null){ head=head.next; res++; } if(res<k) return h; //将当前前k个节点一组翻转 ListNode pre=new ListNode(0); pre.next=null; int p=0; ListNode s=new ListNode(0); ListNode j=h; while(h!=null){ p++; ListNode temp=h.next; h.next=pre.next; pre.next=h; if(p==k){ s=temp; break; } h=temp; } //System.out.println(s.val); //将当前第k+1个节点进行递归 ListNode sec=reverseKGroup(s,k); j.next=sec; return pre.next; }