33,006
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct list_node {
int data;
struct list_node *next;
};
//嵌套循环,分段逆序,O(n)
void reverse_list(struct list_node *head, int n)
{
int i;
struct list_node *curr, *p, *tail;
p = head->next; //head指向头结点
curr = tail = p;
while(curr) {
curr = curr->next;
for(i = 1; i < n && curr; ++i) { //头插入法逆序
head->next = curr;
curr = curr->next;
head->next->next = p;
p = head->next;
}
tail->next = curr;
head = tail;
tail = p = curr;
}
}
void test(void)
{
int data[] = {1, 2, 3, 4, 5, 6, 0};
int *p = data;
struct list_node head, *curr;
int i;
curr = &head;
while(*p) {
curr->next = malloc(sizeof(struct list_node));
if(!curr->next)
exit(-1);
curr = curr->next;
curr->data = *p++;
}
for(i = 1; i < 7; ++i) {
printf("v = %d\n", i);
reverse_list(&head, i); //前一次执行结果作为第二次执行的输入
curr = head.next;
while(curr) {
printf("%d ", curr->data);
curr = curr->next;
}
printf("\n");
}
while(head.next) {
curr = head.next;
head.next = curr->next;
free(curr);
}
}
int main(int argc, char *argv[])
{
test();
return 0;
}
运行结果
v = 1
1 2 3 4 5 6
v = 2
2 1 4 3 6 5
v = 3
4 1 2 5 6 3
v = 4
5 2 1 4 3 6
v = 5
3 4 1 2 5 6
v = 6
6 5 2 1 4 3
注:前次输出是后辞的输入
void backward(int v,pNode pHead){
Node *p = pHead->pNext;
Node *beforeP = pHead;
Node *q;
int count = v-1;
while(p->pNext != NULL){
q = p->pNext;
//经过v周期后初始化
if(count == 0){
beforeP = p;
p = q;
q = q->pNext;
count = v-1;
}
//逆序
p->pNext = q->pNext;
q->pNext = beforeP->pNext;
beforeP->pNext = q;
count--;
}
}