反转链表核心思想:在循环中每次只让这个元素插入到链表的头部
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
//设置一个僵尸2节点就是方便一点
ListNode* dummy = new ListNode(0);
//prev永远指的是每一部分的前一个节点 即上链连接下链的那个节点
ListNode* prev = dummy; ListNode* cur = head; ListNode* curNext;
dummy->next = head;
int length = 0;
while(head != NULL){
length ++; head = head -> next;
}
for(int i = 0 ; i < length / k ; ++ i){
for(int j = 0 ; j < k - 1 ; ++ j){
//这里反转的有一点绕
//记住定义
//prev永远记录的是要插入位置的前一节点
//cur为当前操作节点
curNext = cur->next; //要反转的节点 这里每次先反转一下,然后根据k的值,j来循环以达到反转需要的次数
cur->next = curNext -> next; //跨过了要反转的节点
curNext->next = prev->next; //反转
prev -> next = curNext;
}
//每一部分结束后 将prev和cur更新到下一部分中
prev = cur; cur = prev->next;
}
ListNode* temp = dummy->next;
delete dummy;
return temp;
}
};