一尘不染

如何仅使用两个指针来反转单链列表?

algorithm

我想知道是否存在仅使用两个指针来反转单链接列表的逻辑。

以下是用于逆转使用三个指针即单链表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;
}

还有其他替代方法可以反向链接列表吗?就时间复杂度而言,颠倒单个链表的最佳逻辑是什么?


阅读 251

收藏
2020-07-28

共1个答案

一尘不染

还有其他选择吗?不,这很简单,没有根本不同的方法。该算法已经是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;
}
2020-07-28