题意:将列表每K个反转一次。
如k=2,1-2-3-4-5 2-1-4-3-5
如k=3,1-2-3-4-5 3-2-1-4-5
反转方法是pre-cur-nxt pre是开始链表的头结点人为加的,是k数组前一个,last是k数组中首位,next是k数组后一个,这里将每次cur都暂存在pre的next中,使用dummy作为pre来进行,
class Solution {
public:
ListNode *reverseKGroup(ListNode *head, int k) {
if (!head || k == 1) return head;
ListNode *dummy = new ListNode(-1);
ListNode *pre = dummy, *cur = head;
dummy->next = head;
int i = 0;
while (cur) {
++i;
if (i % k == 0) {
pre = reverseOneGroup(pre, cur->next);
cur = pre->next;
} else {
cur = cur->next;
}
}
return dummy->next;
}
ListNode *reverseOneGroup(ListNode *pre, ListNode *next) {
ListNode *last = pre->next;
ListNode *cur = last->next;
while(cur != next) {
last->next = cur->next;
cur->next = pre->next;
pre->next = cur;
cur = last->next;
}
return last;
}
};