试写一道算法,实现单链表的就地逆置(反转),即利用原表的存储空间将线性表(a1,a2,⋯an)逆置(反转)为(an⋯,a2,a1)。
输入格式
输入共有两行,第一行为线性表长度 n(0≤n≤26)。
第二行共有 n 个大写字母,为顺序输入的线性表的元素,每两个大写字母之间一个空格。
输出格式
输出只有一行,为逆置后的线性表元素的顺序输出。每两个大写字母之间一个空格,最后一个大写字母后面没有空格。
#include<iostream>
using namespace std;
typedef struct Node {
char data;
struct Node *next;
}Node, *LinkedList;
LinkedList insert(LinkedList head, Node *node, int index) {
if (head == NULL) {
if (index != 0) {
return head;
}
head = node;
return head;
}
Node *current_node = head;
int cnt = 0;
while (current_node->next != NULL && cnt<index - 1) {
current_node = current_node->next;
cnt++;
}
if (cnt == index - 1) {
node->next = current_node->next;
current_node->next = node;
return head;
}
return head;
}
LinkedList reverse(LinkedList head) {
Node *node = head;
char a[27];
int num = 0;
while (node != NULL) {
a[num] = node->data;
num++;
node = node->next;
}
node = head;
for (int i = 0; i<num; i++) {
node->data = a[num-i-1];
node = node->next;
}
return head;
}
void output(LinkedList head) {
if (head == NULL) {
return;
}
int cnt = 0;
Node *current_node = head;
while (current_node != NULL) {
if (cnt == 0) {
cout << current_node->data;
cnt++;
current_node = current_node->next;
}
else {
cout << " " << current_node->data;
current_node = current_node->next;
}
}
cout << endl;
}
void clear(LinkedList head) {
Node *current_node = head;
while (current_node != NULL) {
Node *dele_node = current_node;
current_node = current_node->next;
free(dele_node);
}
}
int main() {
int n;
LinkedList linkedlist = NULL;
cin >> n;
for (int i = 0; i<n; i++) {
Node *node = (Node*)malloc(sizeof(Node));
cin >> node->data;
node->next = NULL;
linkedlist = insert(linkedlist, node, i);
}
linkedlist = reverse(linkedlist);
output(linkedlist);
clear(linkedlist);
return 0;
}