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)
  • 相关阅读:
    C# 实现将 PDF 转文本的功能
    推荐大家使用的CSS书写规范、顺序
    Android 应用开发者必看的 9 个 Tips
    网站统计中的数据收集原理及实现
    JSON劫持漏洞攻防原理及演练
    巧妙使用 CSS3 的褪色和动画效果制作消息提醒框
    20条常见的编码陷阱
    11 个最佳 jQuery 滚动条插件
    JavaScript客户端MVC 框架综述
    20个初学者实用的CSS技巧
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9751893.html
Copyright © 2011-2022 走看看