025 Reverse Nodes in k-Group 每k个一组翻转链表

给出一个链表,一次翻转 k 个指针节点,并返回修改后的链表。
k 是一个正整数,并且小于等于链表的长度。如果指针节点的数量不是 k 的整数倍,那么最后剩余的节点应当保持原来的样子。
你不应该改变节点的值,只有节点位置本身可能会改变。
题目应当保证,仅使用恒定的内存。
例如,
给定这个链表:1->2->3->4->5
当 k = 2时,应当返回: 2->1->4->3->5
当 k = 3时,应当返回: 3->2->1->4->5
详见:https://leetcode.com/problems/reverse-nodes-in-k-group/description/

实现语言:Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(head==null||k==1){
            return head;
        }
        ListNode dummy=new ListNode(-1);
        ListNode pre=dummy;
        ListNode cur=head;
        dummy.next=head;
        int i=0;
        while(cur!=null){
            ++i;
            if(i%k==0){
                pre=reverseOneGroup(pre,cur.next);
                cur=pre.next;
            }else{
                cur=cur.next;
            }
        }
        return dummy.next;
    }
    private ListNode reverseOneGroup(ListNode pre,ListNode next){
        ListNode last=pre.next;
        ListNode cur=last.next;
        while(cur!=next){
            last.next=cur.next;
            cur.next=pre.next;
            pre.next=cur;
            cur=last.next;
        }
        return last;
    }
}

 实现语言:C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(!head||k==1)
        {
            return head;
        }
        ListNode* dummy=new ListNode(-1);
        ListNode* pre=dummy;
        ListNode* cur=head;
        dummy->next=head;
        int i=0;
        while(cur)
        {
            ++i;
            if(i%k==0)
            {
                pre=reverseOneGroup(pre,cur->next);
                cur=pre->next;
            }
            else
            {
                cur=cur->next;
            }
        }
        return dummy->next;
    }
    ListNode* reverseOneGroup(ListNode* pre,ListNode* next)
    {
        ListNode* last=pre->next;
        ListNode* cur=last->next;
        while(cur!=next)
        {
            last->next=cur->next;
            cur->next=pre->next;
            pre->next=cur;
            cur=last->next;
        }
        return last;
    }
};

 参考:https://www.cnblogs.com/grandyang/p/4441324.html

posted on 2018-04-01 17:03  lina2014  阅读(139)  评论(0编辑  收藏  举报

导航