• 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)
  • 相关阅读:
    RNA velocity | RNA速率
    Dynamic networks | 动态网络
    Scale Free Network | 无标度网络
    GO | KEGG的注释是怎么来的?
    Nearest neighbor graph | 近邻图
    L0 Regularization
    Median absolute deviation | Singular Value Decomposition奇异值分解 | cumulative sums |
    Multivariate normal distribution | 多元正态分布
    相似性 similarity | Pearson | Spearman | p-value | 相关性 correlation | 距离 distance | distance measure
    Type I and type II errors | 第一类错误和第二类错误
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9751893.html
Copyright © 2020-2023  润新知