目录
一、顺序表元素的就地逆置:
(1)完整代码:
#include<stdio.h>
#define dataType int
#define maxLen 100
typedef struct {
dataType arr[maxLen];
dataType length;
}SeqList;
void printfList(SeqList list){
for(int i=0;i<list.length;i++){
printf("%d ",list.arr[i]);
}
}
int main(){
SeqList L={{1,2,3,4,5,6,7,8,9},9};
printf("元素逆置前:");
printfList(L);
printf("\n");
int temp;
for(int i=0;i<L.length/2;i++){
temp=L.arr[i];
L.arr[i]=L.arr[L.length-1-i];
L.arr[L.length-1-i]=temp;
}
printf("元素逆置后:");
printfList(L);
}
(2)解题思路流程:
利用循环将数组中的首尾元素依次交换位置,循环次数为arr.length/2。
二、链表元素的就地逆置:
(1)完整代码:
#include<stdio.h>
#include<stdlib.h>
#define dataType int
//定义节点结构体
typedef struct node {
dataType data;
struct node*next;
} Node;
//初始化头结点
void listInitiate(Node**head) {
*head = (Node*)malloc(sizeof(Node));
(*head)->next = NULL;
}
//利用尾插法和数组建立链表
void listBuild(Node*head, dataType arr[], int n) {
Node*p = head;
for (int i = 0; i < n; i++) {
Node*q = (Node*)malloc(sizeof(Node));
q->data = arr[i];
q->next = NULL;
p->next = q;
p = q;
}
}
//链表元素逆置函数
void listReserve(Node*head) {
if (head == NULL || head->next == NULL || head->next->next == NULL) {
return;
}
Node*p = head->next->next;
head->next->next = NULL;
while (p != NULL) {
Node*q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
}
//打印链表
void printList(Node*head) {
Node*p = head;
while (p -> next != NULL) {
printf("%d ", p->next->data);
p = p->next;
}
}
//主函数
int main() {
Node link;
Node*p;
p = &link;
dataType arr[] = {1, 2, 3, 4, 5, 6, 7};
listInitiate(&p);
listBuild(p, arr, 7);
printf("元素逆置前:");
printList(p);
printf("\n");
listReserve(p);
printf("元素逆置后:");
printList(p);
}
(2)解题思路流程:
①将第一个元素节点和第二个元素节点分开。
Node*p = head->next->next;
head->next->next = NULL;
②再利用头插法依次将第二个元素 插入到第一个元素节点前。
p->next = head->next;
head->next = p;
③不断循环直到第一个元素节点 处于链表末尾。