问题描述:
给出一个O(n)时间的非递归过程,实现队一个含n个元素的单链表的逆转。要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间。
问题分析:
题目给我们的数据结构是单链表。我们在循环中,每次把链表的next指针指向它的前驱节点就行了。但是当前节点的next指针修改后,它原本的下一个节点就找不到了,所以我们需要一个额外变量保存下一个节点。这样,程序需要三个变量p,q,r,q保存当前节点,p保存q的前驱节点,r保存q的后继节点。每次循环,更新这三个节点即可。最后把原本链表的头节点的next置为空,然后将最后一个节点置为头节点。
链表的定义如下:
#include<stdio.h>
#include<stdlib.h>
struct Node {
int n;
struct Node* next;
};
struct List {
struct Node* head;
};
逆转列表的代码:
void trans(struct List* l) {
struct Node* p, * q, * r;
p = l->head;
q = p->next;
if (q != nullptr)
r = q->next;
else
r = nullptr;
while (q != nullptr) {
q->next = p;
p = q;
q = r;
if(q!=nullptr)
r = q->next;
}
l->head->next = nullptr;
l-&