高效的算法是指少用时间、少用空间。试分别用顺序表和单链表作为存储结构,设计高效的算法,实现将线性表(ao,ai,…,an)就地逆置的操作。所谓"就地",是指辅助空间复杂度应为O(1)。C语言编程及算法流程图
时间: 2024-10-05 16:05:00 浏览: 41
在C语言中,对于顺序表和单链表这两种数据结构,实现线性表逆置的高效算法略有不同:
**顺序表(数组)逆置操作:**
1. 初始化两个指针,一个指向数组头部(i = 0),另一个指向尾部(j = n - 1)。
2. 当 i < j 时,交换 a[i] 和 a[j] 的值,然后同时移动指针 i 向右一位 (i++),j 向左一位 (j--)。
3. 当 i >= j 时,逆置完成。
```c
void reverseArray(int arr[], int n) {
int i = 0, j = n - 1;
while (i < j) {
swap(&arr[i], &arr[j]);
i++;
j--;
}
}
```
**单链表逆置操作(不考虑头结点):**
1. 创建三个指针,prev, curr, next 分别表示当前节点的前驱、当前节点和下一个节点。
2. 将 prev 设为 NULL,curr 设置为头节点。
3. 循环遍历链表,每次循环:
a. 获取 curr 的下一个节点 next。
b. 将 curr 的 next 指向 prev。
c. 更新 prev 为 curr,curr 为 next。
4. 遍历结束后,prev 就指向了新的头节点,设置头节点为 prev。
```c
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL, *curr = head, *next;
while (curr != NULL) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev; // 返回新头节点
}
```
阅读全文