我想知道是否存在某种逻辑,可以只用两个指针来反转一个单链表.

以下内容用于使用三个指针(即pqr)反转单链表:

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;
}

是否有其他替代方案可以反转链表?就时间复杂性而言,反转单链表的最佳逻辑是什么?

推荐答案

还有别的 Select 吗?不,这很简单,没有根本不同的方法.这个算法已经是O(n)时间了,你不能再快了,因为你必须修改每个 node .

看起来你的代码在正确的轨道上,但它在上面的表格中不太有效.以下是一个有效的版本:

#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;
}

C++相关问答推荐

Visual Studio和Codebocks中的不同输出

C sscanf没有捕获第二个参数

Apple Libm的罪恶功能

C:gcc返回多个错误定义,但msvc—不""'

Mise()在虚拟内存中做什么?

Tiva TM4C123GXL的I2C通信

括号中的堆栈实现错误问题

为什么输出不是从上到下C

堆栈在作用域阻塞后会被释放吗?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

将数据移动到寄存器时出现分段故障

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

在libwget中启用Cookie会导致分段故障

为什么电路板被循环删除?

为什么编译器不能简单地将数据从EDI转移到EAX?

OSDev--双缓冲重启系统

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

将数组中的所有元素初始化为 struct 中的相同值