利用单链表存储该数组,并实现将其逆转
时间: 2023-06-07 09:10:52 浏览: 64
好的,我了解了,现在回答您的问题。对于利用单链表存储该数组,并实现将其逆转的问题,具体操作如下:
1. 首先定义一个节点结构体,包含一个数据域 `data` 和一个指针域 `next`,用于指向下一个节点。
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
2. 初始化一个头节点 `head`,并将其指向第一个节点。
```c
Node* reverseList(Node* head) {
Node* new_head = NULL; // 定义新链表头结点
while (head) {
Node* next = head->next;
head->next = new_head;
new_head = head;
head = next;
}
return new_head; // 返回新链表头结点
}
```
3. 定义一个 `reverseList` 函数,参数为链表的头结点 `head`,用于实现将链表逆转。在函数内部,定义一个新的头结点 `new_head`,表示逆转后的新链表头结点,初始值为 `NULL`。
4. 定义一个循环,循环遍历链表,将每个节点的 `next` 指针指向前面的节点,直到遍历完整个链表。这一步具体实现为:
a. 定义一个指针 `next`,用于暂存当前节点的下一个节点指针,避免操作当前节点指针时将下一个节点的指针丢失。
b. 将当前节点的 `next` 指针指向新链表头结点 `new_head`。
c. 将新链表头结点指针 `new_head` 指向当前节点,完成节点插入。
d. 将当前节点指针 `head` 移动到下一个节点,继续遍历。
5. 遍历结束后,返回新链表头结点指针 `new_head`。
整体代码如下:
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* reverseList(Node* head) {
Node* new_head = NULL;
while (head) {
Node* next = head->next;
head->next = new_head;
new_head = head;
head = next;
}
return new_head;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(int);
Node* head = NULL;
Node* tail = NULL;
// 构造链表
for (int i = 0; i < n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = arr[i];
node->next = NULL;
if (head == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
// 将链表逆序
head = reverseList(head);
// 遍历链表并输出
Node* p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
putchar('\n');
return 0;
}
```
以上就是将一个数组通过单链表进行存储并且逆序的具体实现代码。