Reverse Nodes in k-Group Java

来源:互联网 发布:sms软件下载 编辑:程序博客网 时间:2024/06/05 07:40
/** * 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 kif(count==k){//reverse linked list in each group individually//and locate and update beginPrev nodebeginPrev=reverse(beginPrev,endNext);count=0;}cur=endNext;}return dummy.next;    }    //reverse of linked list and reture the updated beginPrev nodepublic 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;}}

0 0
原创粉丝点击