我想知道是否存在仅使用两个指针来反转单链接列表的逻辑。
以下是用于逆转使用三个指针即单链表p,q,r:
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; }