单链表逆置算法
void reverse(linklist &L) {
lnode *p = L->next, *pre;
L->next = NULL;
while (p) {
pre = p->next;
p->next = L->next;
L->next = p;
p = pre;
}
}
void reverse(linklist &L) {
lnode* pre=NULL;
lnode* cur=L->next;
lnode* next=NULL;
while(cur!=NULL)
{
next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
L->next = pre;
}
lnode *reverseFromTo(lnode *L, lnode *end) {
lnode *pre = NULL;
lnode *cur = L;
lnode *next = NULL;
while (cur != end) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
lnode *reverseByGroup(lnode *L, int k, int length) {
if(k == 1)
return L;
if (k > length) {
L->next = reverseFromTo(L->next, NULL);
return L;
}
lnode *start = L->next;
lnode *end = L->next;
lnode *rear;
int count = 1;
int flag = 1;
for (int i = 0; i < (length + 1) / k; i++) {
while (count++ != k + 1) {
if (end == NULL) break;
end = end->next;
}
if (flag == 1) {
L->next = reverseFromTo(start, end);
rear = start;
rear->next = end;
flag = 0;
} else {
rear->next = reverseFromTo(start, end);
rear = start;
rear->next = end;
}
start = end;
count = 1;
}
return L;
}