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)
  • 相关阅读:
    逻辑最复杂的MVVM模式实现
    剧本:博客园之天外飞仙
    本博客开始偏转方向,开始研究UDP在WCF下的实现
    Prism研究 目录
    Q & A category in Prism forums, with some answers and samples of mine.
    我眼中的SOA,以及在实际项目中的应用经验
    数据结构 C#描述 第三章 (更新)
    数据结构 C#描述 第四章
    数据结构 C#描述 第七章 (第一部分)
    数据结构 C#描述
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9751893.html
Copyright © 2011-2022 走看看