C语言假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试
时间: 2023-06-12 19:03:01 浏览: 76
算法思路:
1. 定义三个指针:p、q、r,分别指向头结点、第一个结点和第二个结点。
2. 从第二个结点开始,依次将每个结点插入到头结点之后,直到最后一个结点。
3. 将头结点指向链表的新的第一个结点。
代码实现:
```c
void reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return;
}
ListNode* p = head;
ListNode* q = head->next;
ListNode* r = q->next;
p->next = NULL;
while (r != NULL) {
q->next = p;
p = q;
q = r;
r = r->next;
}
q->next = p;
head->next = q;
}
```
测试用例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
void printList(ListNode* head) {
ListNode* p = head->next;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
void insert(ListNode* head, int val) {
ListNode* p = (ListNode*)malloc(sizeof(ListNode));
p->val = val;
p->next = head->next;
head->next = p;
}
int main() {
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
for (int i = 1; i <= 5; i++) {
insert(head, i);
}
printf("Original list: ");
printList(head);
reverseList(head);
printf("Reversed list: ");
printList(head);
return 0;
}
```
输出结果:
```
Original list: 5 4 3 2 1
Reversed list: 1 2 3 4 5
```
阅读全文