1. 目标
以单链表为存储结构,写出就地逆置的算法
2. 实现
计划按照以下两步来实现:
1)摘除头结点
2)按照头插法的原则,建立链表
3. 样例
input the number of Nodes:9
input data:1 3 2 6 8 9 4 5 7
Before reverse:1 3 2 6 8 9 4 5 7
After reverse:7 5 4 9 8 6 2 3 1
4. 代码
#include<iostream>
#include<cstdio>
using namespace std;
struct Node
{
int data;
Node* next;
};
void reverse(Node* first)
{
Node *p, *q;
p = first->next; //保存原链表的元素
first->next = NULL; //用原链表的头结点建立新的结点
while(p!=NULL)
{
q = p->next;
p->next = first->next;
first->next = p;
p = q;
}
return;
}
void print_node(Node *first)
{
//打印
Node *p = first->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return;
}
int main()
{
int n;
printf("input the number of Nodes:");
scanf("%d", &n);
//构建单链表
Node *first = new Node;
first->next = NULL;
Node *r = first;
printf("input data:");
for (int i = 0; i < n; i++)
{
Node *p = new Node;
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
printf("Before reverse:");
print_node(first);
reverse(first);
printf("After reverse:");
print_node(first);
//析构
while (first != NULL)
{
Node *p = first;
first = first->next;
delete p;
}
return 0;
}
5. 拓展
乍一看,这段代码好像很复杂,实际上就是几个链表的基本操作放在一起。关于单链表的逆置,笔者还有一种实现的思路:我们没有必要重建一个新的链表,而是把它当成一个数组的逆置来实现,直接对原链表中的data进行交换。至于数组的逆置,可以结合栈先入后出的特点实现,也可以直接实现。结果如何,留给以后探究吧。