c_cpp 25. k-Group中的反向节点 - 硬 - 2018.8.3

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 25. k-Group中的反向节点 - 硬 - 2018.8.3相关的知识,希望对你有一定的参考价值。

/**
1:根据 n 来进行分拆,每隔 n 个数进行一次逆转
2:需要三个指针,preNode,head 以及 nextNode 
3:preNode 在逆转之后链接左边的节点,nextNode 用来链接右边的节点,head 本身用来操作
 */
 
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head) return NULL;
        ListNode *preNode = NULL;
        ListNode *nextNode;
        while (head->next != NULL) {
            nextNode = head->next;
            head->next = preNode;
            preNode = head;
            head = nextNode;
        }
        head->next = preNode;
        return head;
    }
    ListNode* gotoIndex(ListNode* node, int index) {
        if (node == NULL && index <= 0) return node;
        while (index > 0 && node != NULL) {
            node = node->next;
            index--;
        }
        return node;
    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (k <= 1 || head == NULL) return head;
        ListNode *kHeadNode = head;
        ListNode *kTailNode;
        vector<vector<ListNode *>> kNodes;
        while (kTailNode = gotoIndex(kHeadNode, k-1)) {
            vector<ListNode *> tmpVec;
            tmpVec.push_back(kHeadNode);
            tmpVec.push_back(kTailNode);
            kNodes.push_back(tmpVec);
            kHeadNode = kTailNode->next;
        }
        if (kNodes.size() <= 0) {
            return head;
        }
        for (int idx = 0; idx < kNodes.size(); idx++) {
            vector<ListNode *> nodeVec = kNodes[idx];
            nodeVec[1]->next = NULL;
            reverseList(nodeVec[0]);
        }
        ListNode *nHead = kNodes[0][1];
        for (int idx = 0; idx < kNodes.size()-1; idx++) {
            vector<ListNode *> kNode1 = kNodes[idx];
            vector<ListNode *> kNode2 = kNodes[idx+1];
            kNode1[0]->next = kNode2[1];
        }
        if (kHeadNode != NULL) {
            kNodes[kNodes.size()-1][0]->next = kHeadNode;
        }
        return nHead;
    }
};

以上是关于c_cpp 25. k-Group中的反向节点 - 硬 - 2018.8.3的主要内容,如果未能解决你的问题,请参考以下文章

java 25. k-Group中的反向节点(#iterative).java

java 25. k-Group中的反向节点(#iterative).java

java 25. k-Group中的反向节点(#iterative).java

java 25. k-Group中的反向节点(#iterative).java

java 25. k-Group中的反向节点(#iterative).java

leetcode#25 Reverse Nodes in k-Group