力扣练习——10 K 个一组翻转链表

1.问题描述

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

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

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

 

示例:

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

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

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

 

说明:

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

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

 

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

#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) {

             //填充本函数完成功能  

    }

};

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\n";

}

int main()

{

    int k;

    ListNode* head = createByTail();

    cin>>k;

    head=Solution().reverseKGroup(head,k);

    displayLink(head);

    return 0;

}

2.输入说明

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

再输入整数k。

3.输出说明

输出格式见范例

4.范例

输入

5
1 2 3 4 5
2

输出

head-->2-->1-->4-->3-->5-->tail

5.代码

#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) {

        //填充本函数完成功能  
        //1.计算链表长度len以及需要翻转的组数len/k
        int len = 0;
        ListNode *nhead = (ListNode*)malloc(sizeof(ListNode));//新建一个空的头结点,方便后续的头插法操作
        nhead->next = head;
        ListNode *p = head,*pre ,*q;
        pre = nhead;
        while (p)
        {
            len++;
            p = p->next;
        }
        p = head;
        for (int i = 0; i < len / k; i++)
        {
            for (int j = 0; j < k-1; j++) //头插法操作 ,注意这里j的次数为k-1    如逆转1->2->3 ,只要将2->3分别头插法插入原链表中
            {
                q = p->next; //q指向p的后继
                p->next = q->next;
                q->next = pre->next; //将q插入到p的前面
                pre->next = q;
            }
            pre = p;
            p = p->next;
        }
        return nhead->next;
    }

};

ListNode *createByTail()

{

    ListNode *head;

    ListNode *p1, *p2=NULL;

    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\n";

}

int main()

{

    int k;

    ListNode* head = createByTail();

    cin >> k;

    head = Solution().reverseKGroup(head, k);

    displayLink(head);

    return 0;

}

 

posted @ 2022-07-06 13:44  努力奋斗的小企鹅  阅读(31)  评论(0)    收藏  举报