题目:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/submissions/
#include
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
/*
*给一个链表,每k个节点一组进行翻转,
*返回翻转后的链表
*/
if(k == 1) return head;//特判
//确定是否有k个数
ListNode *p1 = head;
bool flag = 1;
for(int i = 1;i next == NULL){
flag = 0;break;
}
p1 = p1->next;
}
if(!flag) return head;
//前k个数翻转
p1 = head->next;
ListNode *p2 = head->next;
ListNode *pre = head;
ListNode *fi = head;//头元素
for(int i = 2;i next;
p1->next = pre;
pre = p1;//更新pre
p1 = p2;//更新p1
}
fi->next = p2->next;
p2->next = pre;
head = p2;//更新head
ListNode *ed = fi;//设置尾元素
fi = fi->next;//更新fi
while(1) {
//确定是否有k个数
p1 = fi;
flag = 1;
for(int i = 1;i next == NULL){
flag = 0;break;
}
p1 = p1->next;
}
if(!flag) return head;
//k个数翻转
p1 = p2 = fi->next;
pre = fi;
for(int i = 2;i next;
p1->next = pre;
pre = p1;//更新pre
p1 = p2;//更新p1
}
fi->next = p2->next;
p2->next = pre;
ed->next = p2;//衔接前k个元素
ed = fi;//更新ed
fi = fi->next;//更新fi
}
}
void print(ListNode* head) {
while(head != NULL) {
printf("%d ",head->val);
head = head->next;
}
printf("\n");
}
};
int main(int argc, char *argv[])
{
Solution solution;
int n,x,k;
ListNode* head = new ListNode(-1);
ListNode* cur = head;
scanf("%d",&n);
while(n--) {
scanf("%d",&x);
cur->next = new ListNode(x);
cur = cur->next;
}
scanf("%d",&k);
// solution.print(head->next);//
solution.reverseKGroup(head->next,k);
return 0;
}
/*
4
1 2 3 4
4
4
1 2 3 4
2
*/