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.

    If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

    You may not alter the values in the nodes, only nodes itself may be changed.

    Only constant memory is allowed.

    For 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

    解法:

    采用递归法或者迭代法

    /**
     * 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) {
            if(!head || !head->next || k < 2) return head;
            ListNode* next_group = head;
            for(int i =0 ;i < k ; ++i){
                if(next_group) next_group =next_group->next;
                else return head;
            }
            ListNode* next_head = reverseKGroup(next_group,k);
            ListNode *pre = NULL , *cur = head;
            while(cur != next_group) {
                ListNode* next = cur->next;
                cur->next = pre?pre:next_head;
                pre = cur;
                cur = next;
            }
            return pre;
        }
    };
    class Solution {
    public:
        istNode *reverseKGroup(ListNode *head, int k) {
            if (head == nullptr || head->next == nullptr || k < 2) return head;
            ListNode dummy(-1);
            dummy.next = head;
            for(ListNode *prev = &dummy, *end = head; end; end = prev->next) {
                for (int i = 1; i < k && end; i++)
                    end = end->next;
                if (end == nullptr) break; // 不足 k 个
                prev = reverse(prev, prev->next, end);
            }
            return dummy.next;
        }
        // prev 是 first 前一个元素, [begin, end] 闭区间,保证三者都不为 null
        // 返回反转后的倒数第 1 个元素
        ListNode* reverse(ListNode *prev, ListNode *begin, ListNode *end) {
            ListNode *end_next = end->next;
            for (ListNode *p = begin, *cur = p->next, *next = cur->next;
            cur != end_next;p = cur, cur = next, next = next ? next->next : nullptr) {
                cur->next = p;
            }
            begin->next = end_next;
            prev->next = end;
            return begin;
    }
    };
  • 相关阅读:
    Java三大特殊类
    静态顺序表and动态顺序表(一)_插入操作
    模拟实现memcpy、memmove函数
    模拟实现strcpy函数
    模拟实现Strlen函数
    数组相关知识总结(一)
    C语言学习总结(二)__操作符
    受控组件 & 非受控组件
    SyntheticEvent
    ReactDOM & DOM Elements
  • 原文地址:https://www.cnblogs.com/CarryPotMan/p/5343684.html
Copyright © 2011-2022 走看看