zoukankan      html  css  js  c++  java
  • 25. Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

    k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

    Example:

    Given this linked list: 1->2->3->4->5

    For k = 2, you should return: 2->1->4->3->5

    For k = 3, you should return: 3->2->1->4->5

    Note:

    • Only constant extra memory is allowed.
    • You may not alter the values in the list's nodes, only nodes itself may be changed.

    code:

    using a stack

    /**
     * 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) {
            stack<ListNode*> s;
            ListNode* dummy = new ListNode(0);
            dummy->next = head;
            ListNode* current = dummy;
            ListNode* next = dummy->next;
            while (next) {
                for (int i = 0; i < k && next != NULL; ++i) {
                    s.push(next);
                    next = next->next;
                }
                if (s.size() != k) return dummy->next;
                while (!s.empty()) {
                    current->next = s.top();
                    s.pop();
                    current = current->next;
                }
                current->next = next;
            }
            return dummy->next;
        }
    };
    

    Runtime: 24 ms, faster than 32.59% of C++ online submissions for Reverse Nodes in k-Group.

    this isn't conform with this question's  demand.

    the right way:

    class Solution {
    public:
        ListNode *reverseKGroup(ListNode *head, int k) {
            if(head==NULL||k==1) return head;
            int num=0;
            ListNode *preheader = new ListNode(-1);
            preheader->next = head;
            ListNode *cur = preheader, *nex, *pre = preheader;
            while(cur = cur->next) 
                num++;
            while(num>=k) {
                cur = pre->next;
                nex = cur->next;
                for(int i=1;i<k;++i) {
                    cur->next=nex->next;
                    nex->next=pre->next;
                    pre->next=nex;
                    nex=cur->next;
                }
                pre = cur;
                num-=k;
            }
            return preheader->next;
        }
    };
    

    Runtime: 28 ms, faster than 16.72% of C++ online submissions for Reverse Nodes in k-Group.

    it will have a difficulty to understand.

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    Linux之文件处理命令
    Linux基础命令
    rip实验
    Linux基础之磁盘分区
    mysql安装
    centos Apache、php、mysql默认安装路径
    You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
    Wrong permissions on configuration file, should not be world writable!
    机器会学习么 学习总结
    实验 5 Spark SQL 编程初级实践
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9751893.html
Copyright © 2011-2022 走看看