一、递归
- 思路:
k_reverse
取k个节点反转,剩下的再调用k_reverse
取k个节点反转,直到节点数不等于k - 关键在于理解
part_reverse
后的k个节点是end开头,head结尾,所以前k个节点的head指向后k个节点的end(已经反转的) - 想不清楚可以先看循环版本
struct link
{
int a;
link* next;
};
link* part_reverse(link *begin, link *end) {
link *pre = end->next;
while(pre != end) {
link *tmp = begin->next;
begin->next = pre;
pre = begin;
begin = tmp;
}
return pre;
}
link* k_reverse(link* head, int k) {
int cnt = 0;
link * end = head;
while(end != NULL) {
++cnt;
if(cnt == k) break;
end = end->next;
}
if(cnt != k) return head;
link *tmp = part_reverse(head, end);
head->next = k_reverse(head->next, k);
return tmp;
}
二、循环
link* part_reverse(link *begin, link *end) {
link *pre = end->next;
while(pre != end) {
link *tmp = begin->next;
begin->next = pre;
pre = begin;
begin = tmp;
}
return pre;
}
link* k_reverse(link* head, int k) {
int cnt = 0;
link *end = head;
while (end != NULL)
{
++cnt;
if(cnt == k) break;
end = end->next;
}
if(cnt != k) return head;
link *res = part_reverse(head, end);
while(1) {
cnt = 0;
link *pre = head;
head = pre->next;
end = head;
while(end != NULL) {
++cnt;
if(cnt == k) break;
end = end->next;
}
if(cnt != k) return res;
pre->next = part_reverse(head, end);
}
}