10 K 个一组翻转链表(25)

作者: Turbo时间限制: 1S章节: DS:数组和链表

晚于: 2020-07-08 12:00:00后提交分数乘系数50%

截止日期: 2020-07-15 12:00:00

问题描述 :

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明:

你的算法只能使用常数的额外空间。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

可使用以下代码,完成其中的reverseKGroup函数,其中形参head指向无头结点单链表,返回结果链表的头指针。

输入说明 :

首先输入链表长度len,然后输入len个整数,以空格分隔。

再输入整数k。

输出说明 :

输出格式见范例

输入范例 :

5
1 2 3 4 5
2

输出范例:

head-->2-->1-->4-->3-->5-->tail
#include<iostream>
#include<vector>
using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(NULL) {}
    ListNode(int x) : val(x), next(NULL) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) 
    {
        if(head==NULL||head->next==NULL)
            return head;
        ListNode *tail=head;
        for(int i=0;i<k;i++)
        {
            if(tail==NULL)
                return head;
            tail=tail->next;
        }

        ListNode *newhead=reverse(head,tail);//递归 

        head->next=reverseKGroup(tail,k);
        return newhead;
    }

private:
        ListNode *reverse(ListNode *head,ListNode *tail)
        {
            ListNode *pre=NULL,*next=NULL;
            while(head!=tail)//实际上尾结点时没有被反转的 
            {
                next=head->next;
                head->next=pre;
                pre=head;
                head=next;
            }
            return pre;
        }
};
ListNode *createByTail()
{
    ListNode *head;
    ListNode *p1,*p2;
    int n=0,num;
    int len;
    cin>>len;
    head=NULL;
    while(n<len && cin>>num)
    {
        p1=new ListNode(num);
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
    }
    return head;
}
void  displayLink(ListNode *head)
{
    ListNode *p;
    p=head;
    cout<<"head-->";
    while(p!= NULL)
    {
        cout<<p->val<<"-->";
        p=p->next;
    }
    cout<<"tail
";
}
int main()
{
    int k;
    ListNode* head = createByTail();
    cin>>k;
    head=Solution().reverseKGroup(head,k);
    displayLink(head);
    return 0;
}
原文地址:https://www.cnblogs.com/zmmm/p/13617267.html