实现n个整数类型数据的线性链表的逆置,要求不能建立新节点,只能通过表中已有节点的重新组合来完成。 具体内容如下: (1)创建具有n个整数结点的单链表;(可引用第1题) (2)输出原单链表; (3)单链表的逆置; 输出逆置后的单链表
时间: 2024-10-09 07:07:45 浏览: 16
要实现n个整数类型数据的线性链表逆置,而不能新建节点,你可以使用迭代的方式来修改现有链表的指针指向。下面是步骤:
1. 首先,定义链表结构体,假设名为`ListNode`,包含一个整数值`data`和一个指向下一个节点的指针`next`。
```c
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
```
2. 创建一个函数`reverseList`,接受链表头指针`head`作为参数,返回逆置后的链表头指针。
```c
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL; // 初始化前驱节点为NULL
ListNode* current = head; // 当前节点初始化为头节点
ListNode* nextTemp; // 临时存储当前节点的下一个节点
// 迭代遍历链表
while (current != NULL) {
nextTemp = current->next; // 保存当前节点的下一个节点
current->next = prev; // 将当前节点的next指向前驱节点
prev = current; // 前驱节点移动到当前节点
current = nextTemp; // 当前节点移动到下一个节点
}
return prev; // 返回新的头节点,即原尾节点
}
```
3. 测试示例:
创建链表后,可以通过以下方式调用`reverseList`函数并打印链表元素进行验证:
```c
// 创建链表示例
void createList(ListNode** head, int n) {
for (int i = 0; i < n; i++) {
*head = (ListNode*)malloc(sizeof(ListNode));
(*head)->data = i + 1;
if (i == 0)
*head->next = NULL;
else
(*head)->next = (*head - 1);
head = &(*head)->next;
}
}
void printList(ListNode* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
int main() {
ListNode* head = NULL;
createList(&head, 5); // 例如创建长度为5的链表
printf("Original List:\n");
printList(head);
ListNode* reversedHead = reverseList(head);
printf("Reversed List:\n");
printList(reversedHead);
return 0;
}
```
执行这个程序时,你会看到原始链表和它的逆置版本。
阅读全文