我想知道是否存在仅使用两个指针来反转单链接列表的逻辑。
以下是使用三个指针(p
,q
,r
)来反转单个链接列表的方法:
struct node {
int data;
struct node *link;
};
void reverse() {
struct node *p = first,
*q = NULL,
*r;
while (p != NULL) {
r = q;
q = p;
p = p->link;
q->link = r;
}
first = q;
}
还有其他替代方法可以反向链接列表吗?就时间复杂度而言,颠倒单个链表的最佳逻辑是什么?
最佳答案
还有其他选择吗?不,这很简单,而且没有根本不同的方法。该算法已经是O(n)时间,您无法获得比这更快的速度,因为您必须修改每个节点。
看起来您的代码在正确的轨道上,但是在上面的形式中并不能很好地工作。这是一个工作版本:
#include <stdio.h>
typedef struct Node {
char data;
struct Node* next;
} Node;
void print_list(Node* root) {
while (root) {
printf("%c ", root->data);
root = root->next;
}
printf("\n");
}
Node* reverse(Node* root) {
Node* new_root = 0;
while (root) {
Node* next = root->next;
root->next = new_root;
new_root = root;
root = next;
}
return new_root;
}
int main() {
Node d = { 'd', 0 };
Node c = { 'c', &d };
Node b = { 'b', &c };
Node a = { 'a', &b };
Node* root = &a;
print_list(root);
root = reverse(root);
print_list(root);
return 0;
}