zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    正则表达式-入门初探
    pytorch 对变长序列的处理
    数位DP小结
    impala 使用记录
    2017微软第二场笔试题解
    一次分清:jvm内存结构|jmm|java对象模型
    JMM-java内存模型
    java基础总结
    有关秒杀的一点思考
    Elasticsearch 启动报了TypeError: can’t dup Fixnum 错
  • 原文地址:https://www.cnblogs.com/zmmm/p/13617267.html
Copyright © 2011-2022 走看看