题目



知识点
思路
最好画图解决,直观易懂

错误
第一层for循环 是需要执行几次翻转,第二层for循环 是执行一次翻转k次移动
题解
cpp
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
int n = 0;//链表元素个数
for (ListNode* p = head; p; p = p->next) {
n++;
}
//栈上定义dummy对象,函数return后直接销毁
ListNode dummy(0, head);//虚拟头节点
ListNode* cur = head;//指针cur指向当前遍历到的结点
ListNode* pre = NULL;//pre指针指向翻转后的链表的头节点
ListNode* q = &dummy;//q指向dummy(q始终指向要处理结点的前一个结点)
//控制翻转几组
for (; k <= n; n -= k) {
//翻转k个元素
for (int i = 0; i < k; i++) {
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
//链接翻转后的组
ListNode* next = q->next;//next指向翻转后小链表的末尾节点
//next指向翻转后小链表的末尾节点 指向后面的链表
q->next->next = cur;//翻转后的链表和后面的链表连接起来
q->next = pre;//dummy指向新链表的第一个结点
q = next;//q指向下一组的前一个结点(q始终指向要处理结点的前一个结点)
}
return dummy.next;//对象可以直接用.
}
};