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