数据结构-元素逆置

本文介绍了一种简单有效的顺序表元素逆置算法。通过使用两个指针i和j从两端向中间移动并交换元素来实现逆置。适用于奇数和偶数长度的顺序表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构-元素逆置

元素逆置

  • 设计一个算法,将顺序表中所有的元素逆置

思路:

用两个变量 i,j 分别从表头和表尾向中间移动,每次都将 i,j 所代表的元素进行交换操作。

如果表元素为奇数,则他们到达相同位置时结束操作;

如果表元素为偶数,则他们相邻的时候结束操作。

上面这两句话可以总结为当 i < j 时继续执行操作,否则结束操作。

代码:

void reverse(Sqlist &L){ //传入要使其逆置的顺序表,为引用型
    int i,j;  // 创建循环变量
    int temp; // 创建临时变量
    for (i=0, j=L.length-1; i < j; ++i, --j){ //当i<j时,执行操作
		temp = L.data[i];
        L.data[i] = L.data[j];  // 交换操作
        L.data[j] = temp;
    }
}

tips:虽然篇幅很短,但是认真看就能看懂,主要是理解 i,j 是如何运作的,什么时候停止运作,可以自己画一下程序运行的图,便于理解。搞懂这些,元素逆置就是小case。

### JMU 数据结构 单链表 PTA 题解 单链表的可以通过多种方法实现,其中一种常见的方法是通过头插法来完成。这种方法的核心思想是在构建新链表的过程中,每次都将当前节点插入到新链表的头部,从而使得最终的新链表顺序与原链表相反。 以下是基于PTA平台可能涉及的单链表操作的具体实现: #### 实现代码 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { char data; struct Node* next; } LinkNode; // 初始化单链表 LinkNode* InitList() { LinkNode* L = (LinkNode*)malloc(sizeof(LinkNode)); L->next = NULL; return L; } // 尾插法建立单链表 void CreateListTail(LinkNode* L, int n) { LinkNode *p, *r = L; for(int i = 0; i < n; ++i){ p = (LinkNode*)malloc(sizeof(LinkNode)); scanf(" %c", &p->data); p->next = NULL; r->next = p; r = p; } } // 输出单链表 void PrintList(LinkNode* L) { LinkNode* p = L->next; while(p != NULL){ printf("%c ", p->data); p = p->next; } printf("\n"); } // 获取单链表长度 int GetLength(LinkNode* L) { int length = 0; LinkNode* p = L->next; while(p != NULL){ length++; p = p->next; } return length; } // 判断单链表是否为空 bool IsEmpty(LinkNode* L) { return L->next == NULL ? true : false; } // 查找指定位元素 char FindKthElement(LinkNode* L, int k) { LinkNode* p = L->next; int index = 1; while(p && index < k){ p = p->next; index++; } if(index == k && p) return p->data; else{ printf("Index out of range.\n"); exit(1); } } // 插入元素 void InsertElement(LinkNode* L, int pos, char value) { LinkNode* p = L; int index = 0; while(p && index < pos - 1){ p = p->next; index++; } if(!p || index >= pos - 1){ LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); newNode->data = value; newNode->next = p->next; p->next = newNode; }else{ printf("Invalid position to insert.\n"); exit(1); } } // 删除指定位元素 void DeleteElement(LinkNode* L, int pos) { LinkNode* p = L; int index = 0; while(p->next && index < pos - 1){ p = p->next; index++; } if(p->next){ LinkNode* q = p->next; p->next = q->next; free(q); }else{ printf("Invalid position to delete.\n"); exit(1); } } // 单链表 void ReverseList(LinkNode* L) { LinkNode* prev = NULL; LinkNode* current = L->next; LinkNode* next_node = NULL; L->next = NULL; // 头结点指向NULL while(current != NULL){ next_node = current->next; current->next = prev; prev = current; current = next_node; } L->next = prev; // 新链表头指针赋给L->next } // 主函数演示 int main(){ int n; LinkNode* L = InitList(); printf("Enter the number of elements and then the characters:\n"); scanf("%d", &n); CreateListTail(L, n); printf("Original List: "); PrintList(L); ReverseList(L); printf("Reversed List: "); PrintList(L); return 0; } ``` 上述代码实现了单链表的基本功能,并提供了`ReverseList`函数用于执行链表的操作[^3]。此函数利用迭代方式逐步调整每个节点的`next`指针方向,从而使整个链表反转。 #### 解决方案说明 - **初始化**:创建一个带头结点的空链表。 - **尾插法建表**:按照输入数据逐个插入到链表尾部。 - **打印链表**:遍历并输出链表中的所有元素- **获取长度**:统计链表中有效节点的数量。 - **判断是否为空**:检查链表是否有任何实际数据节点。 - **查找特定位元素**:定位到目标索引处的节点并返回其值。 - **插入/删除元素**:分别支持在任意位插入或删除节点的操作。 - **链表**:通过改变各节点之间的连接关系实现整体倒序排列。 ####
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独行侠329

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值