Je déteste être le porteur de mauvaises nouvelles, mais je ne pense pas que vos trois pointeur de la solution fonctionne réellement. Lorsque je l'ai utilisé dans le test suivant harnais, la liste a été réduite à un nœud, comme par la sortie suivante:
==========
4
3
2
1
0
==========
4
==========
Vous n'obtiendrez pas de meilleur moment de la complexité de votre solution, car il est O(n) et vous avez à visiter chaque nœud afin de modifier les pointeurs, mais vous pouvez faire une solution avec seulement deux pointeurs assez facilement, comme illustré dans le code suivant:
#include <stdio.h>
// The list element type and head.
struct node {
int data;
struct node *link;
};
static struct node *first = NULL;
// A reverse function which uses only two extra pointers.
void reverse() {
// curNode traverses the list, first is reset to empty list.
struct node *curNode = first, *nxtNode;
first = NULL;
// Until no more in list, insert current before first and advance.
while (curNode != NULL) {
// Need to save next node since we're changing the current.
nxtNode = curNode->link;
// Insert at start of new list.
curNode->link = first;
first = curNode;
// Advance to next.
curNode = nxtNode;
}
}
// Code to dump the current list.
static void dumpNodes() {
struct node *curNode = first;
printf ("==========\n");
while (curNode != NULL) {
printf ("%d\n", curNode->data);
curNode = curNode->link;
}
}
// Test harness main program.
int main (void) {
int i;
struct node *newnode;
// Create list (using actually the same insert-before-first
// that is used in reverse function.
for (i = 0; i < 5; i++) {
newnode = malloc (sizeof (struct node));
newnode->data = i;
newnode->link = first;
first = newnode;
}
// Dump list, reverse it, then dump again.
dumpNodes();
reverse();
dumpNodes();
printf ("==========\n");
return 0;
}
Ce code affiche:
==========
4
3
2
1
0
==========
0
1
2
3
4
==========
je pense que c'est ce que vous avez été au bout. Il est possible de faire ça depuis que, une fois que vous avez chargé first
dans le pointeur de la traversée de la liste, vous pouvez ré-utiliser first
.