C语言 描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 输入 输入链表,0 <= 链表长度 <= 10000 -1表示链表结束符 输出 输出反转后的链表 输入样例 1 2 6 3 4 5 6 -1 输出样例 6 5 4 3 6 2 1
时间: 2024-09-27 09:05:45 浏览: 40
C语言中的链表是一种数据结构,它由一系列节点组成,每个节点包含两个部分:数据域和指针域。在这个问题中,你需要编写一个函数来逆序处理一个单向链表。给定一个链表的头结点作为输入,函数的主要步骤如下:
1. 定义一个辅助变量`prev`,初始化为NULL,用于保存当前节点的前一个节点。
2. 使用一个循环,遍历整个链表:
a. 获取当前节点`curr`,如果它是 `-1`(链表结束符),说明已经到达尾部,跳出循环。
b. 将`curr`的下一个节点`next`设为`prev`,以便更新链表连接。
c. 更新`prev`为`curr`,继续遍历。
d. 记录`curr`的数据(通常是一个整数)并将其添加到结果数组中。
3. 当遍历结束后,将`prev`设为结果数组的第一个元素,因为它现在指向了新的“头”节点。
C语言的具体实现可能会像这样:
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 函数声明
int* reverseList(Node* head);
// 辅助函数,返回倒数第二个节点
Node* getPrevLastNode(Node* head) {
if (head == NULL || head->next == NULL) return head;
Node* prev = head;
while (prev->next->next != NULL) {
prev = prev->next;
}
return prev;
}
// 主函数
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
// 示例链表输入
Node* list = (Node*)malloc(sizeof(Node));
list->data = 1;
list->next = (Node*)malloc(sizeof(Node));
list->next->data = 2;
... // 更多节点的创建
list->next->next->data = -1;
// 反转链表并将结果存储在一个数组中
int* reversedArr = reverseList(list);
// 输出结果数组
printArray(reversedArr, reversedArr[0] == -1 ? 0 : reversedArr[0] + 1);
free(reversedArr); // 释放内存
return 0;
}
// 实现链表反转
int* reverseList(Node* head) {
if (head == NULL) return NULL;
Node* prev = getPrevLastNode(head);
int* result = (int*)malloc(sizeof(int) * (prev == head ? 1 : 0)); // 分配内存
Node* curr = head;
while (curr != prev) {
result[0] = curr->data;
result++;
curr = curr->next;
}
result[0] = prev->data; // 包含结尾符
return result;
}
```
阅读全文