Я ненавижу быть носителем плохих новостей, но я не думаю, что ваше решение с тремя указателями действительно работает. Когда я использовал его в следующем тестовом жгуте, список был сокращен до одного узла в соответствии со следующим выводом:
==========
4
3
2
1
0
==========
4
==========
Вы не получите лучшую временную сложность, чем ваше решение, так как оно O (n), и вам нужно посетить каждый узел, чтобы изменить указатели, но вы можете сделать решение только с двумя дополнительными указателями. легко, как показано в следующем коде:
#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;
}
Этот код выводит:
==========
4
3
2
1
0
==========
0
1
2
3
4
==========
что я думаю, что вы были после. Он действительно может это сделать, поскольку, загрузив first
в указатель, пересекающий список, вы можете повторно использовать first
по своему желанию.