/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
/*Key to solve:
* This is one kind of extended question from reverse linked list, and different with swapPairs question,
* since we are required to reverse in K group, k base on user input
* Approach:
* 1. locate beginPrev and endNext node of each group, in total k group
* 2. using a dummy node 0 for reverse
* 0->1->2->3->4->5->null
* | |
* beginPrev endNext
* after call beginPrev = reverse(beginPrev, endNext)
* 0->3->2->1 -> 4->5->null
* | |
* beginPrev endNext
* if the number of left-out nodes is a multiple of k, then update the endNext, then call reverse function again
* until the left-out nodes less than k, remain same.
* the difficult is to divide a single list into k group and reverse individually, and locate the beginPrev node each time
*/
public class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head ==null || k==1) return head;
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode beginPrev=dummy;
ListNode cur=head;
int count=0;
while(cur!=null){
count++;
ListNode endNext=cur.next;
//select for each group in size of k
if(count==k){
//reverse linked list in each group individually
//and locate and update beginPrev node
beginPrev=reverse(beginPrev,endNext);
count=0;
}
cur=endNext;
}
return dummy.next;
}
//reverse of linked list and reture the updated beginPrev node
public ListNode reverse(ListNode beginPrev,ListNode endNext){
ListNode prev=beginPrev;
ListNode last=beginPrev.next;
ListNode cur=beginPrev.next.next;
while(cur!=endNext){
last.next=cur.next;
cur.next=prev.next;
prev.next=cur;
cur=last.next;
}
return last;
}
}
Reverse Nodes in k-Group Java
最新推荐文章于 2020-02-16 22:57:17 发布