将组内第[2..k]元素依次插入到"上一组尾"prev之后。
子段反转
- https://leetcode.com/problems/reverse-linked-list-ii/
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (!head) return NULL;
ListNode dummy(-1);
dummy.next = head;
auto prev = &dummy;
for (int i = 1; i < m; i++) {
prev = prev->next;
}
// 组头是反转后的组尾,将[m+1..n]的节点插入prev之后
auto newtail = prev->next, curr = newtail->next;
for (int i = m + 1; i <= n; i++) {
newtail->next = curr->next;
curr->next = prev->next;
prev->next = curr;
curr = newtail->next;
}
return dummy.next;
}
k个元素一组地反转
- https://leetcode.com/problems/reverse-nodes-in-k-group/
ListNode* reverseKGroup(ListNode* head, int k) {
int len = 0;
for (auto p = head; p; p = p->next) len++;
ListNode dummy(-1);
dummy.next = head;
auto prev = &dummy; // 组前的指针
for (; len >= k; len -= k) {
// 组头是反转后的组尾newtail,将组内第[2..k]元素插入到prev之后
auto newtail = prev->next, curr = newtail->next;
for (int i = 2; i <= k; i++) {
newtail->next = curr->next;
curr->next = prev->next;
prev->next = curr;
curr = newtail->next;
}
prev = newtail;
}
return dummy.next;
}