Collection -> Array的排序(正序/逆序)

本文介绍了一个使用C#进行数组操作的例子,包括数组的排序、逆序等基本操作,并展示了具体的实现代码。
2005年10月07日 21:40:00

using System;

namespace Array操作
{
/// >summary<
/// Class1 的摘要说明。
/// >/summary<
class Class1
{
/// >summary<
/// 应用程序的主入口点。
/// >/summary<
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
String[] friends=new String[]{"2mojian","1zhengjian","3xugang","4guoyonghui"};
Console.WriteLine("操作前数组数据为:");
foreach(string index in friends)
{
Console.Write(index+" ");
}
Array.Sort(friends);
Console.WriteLine("/n排序后的数据为:");
for(int i=friends.GetLowerBound(0);i>=friends.GetUpperBound(0);i++)
{
Console.Write(friends[i]+" ");
}
Array.Reverse(friends);
Console.WriteLine("/n逆序后的数据为:");
for(int i=friends.GetLowerBound(0);i>=friends.GetUpperBound(0);i++)
{
Console.Write(friends[i]+" ");
}
Console.WriteLine();
Console.Read();
}
}
}



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=496720


### 双向循环链表逆置算法解析 在给定的代码片段中,描述了一种实现双向链表逆序的方法。以下是对其功能的详细解析以及相关的补充说明。 #### 1. 算法核心思想 链表逆序的核心是调整链表中每个节点的指针方向,使得原本的前驱节点变为后继节点,后继节点变为前驱节点。具体来说: - 遍历链表中的每个节点。 - 将当前节点的 `next` 指针指向其前驱节点。 - 更新前驱和当前节点的位置,继续处理下一个节点,直到遍历完成。 在双向链表中,由于每个节点同时维护了前驱和后继指针,因此可以更方便地实现逆序操作。 --- #### 2. 给定代码的功能解析 以下是对给定代码的逐行解析: ```cpp void LinkList::reverse() { Node* p = nullptr, *q, *a = first; // 初始化变量:p为前驱指针,q为当前节点的后继,a保存头节点 first = first->next; // 调整头节点指向第一个有效数据节点 q = first->next; // q初始化为第二个节点 while (1) { // 开始无限循环,后续通过条件判断退出 first->next = p; // 当前节点的next指针指向其前驱节点 p = first; // 更新前驱指针 first = q; // 更新当前节点为下一个节点 if (first == nullptr) break; // 如果当前节点为空,表示遍历结束 q = q->next; // 更新q为下一个节点 } a->next = p; // 最后将头节点的next指针指向新的链表头 first = a; // 恢复头节点 // 输出逆序后的链表内容 cout << "已完成逆序,现在链表存储数据顺为:" << endl; Node* b = first->next; // 从头节点开始遍历 while(b != nullptr) { // 遍历输出每个节点的数据 cout << b->data << '\t'; b = b->next; } } ``` #### 3. 关键点分析 - **指针交换**:通过不断调整 `first->next` 的指向,实现了链表节点的逆序连接。 - **边界条件**:当 `first == nullptr` 时,表示已经遍历到链表末尾,此时退出循环。 - **头节点处理**:为了保持链表结构的完整性,需要特别处理头节点的 `next` 指针[^1]。 - **时间复杂度**:该算法的时间复杂度为 O(n),其中 n 是链表的长度,因为每个节点仅被访问一次。 --- #### 4. 示例代码优化 以下是一个更简洁的双向链表逆序实现版本: ```cpp void reverse(Node* head) { if (head == nullptr || head->next == nullptr) return; // 空链表或单节点链表无需逆序 Node* prev = nullptr; Node* curr = head->next; // 从第一个有效节点开始 Node* next = nullptr; while (curr != nullptr) { next = curr->next; // 保存当前节点的下一个节点 curr->next = prev; // 将当前节点的next指向前驱节点 prev = curr; // 更新前驱节点 curr = next; // 移动到下一个节点 } head->next = prev; // 最后将头节点的next指针指向新的链表头 } ``` --- #### 5. 双向循环链表逆序的特殊性 对于双向循环链表,除了调整 `next` 指针外,还需要同步调整 `prev` 指针。例如: ```cpp void reverseCircularDoublyLinkedList(Node* head) { if (head == nullptr || head->next == head) return; // 空链表或单节点链表无需逆序 Node* curr = head->next; // 从第一个有效节点开始 Node* temp = nullptr; while (curr != head) { // 遍历整个链表 temp = curr->next; // 保存当前节点的下一个节点 curr->next = curr->prev; // 交换next和prev指针 curr->prev = temp; curr = curr->prev; // 移动到下一个节点(原前驱节点) } temp = curr->next; // 处理头节点 curr->next = curr->prev; curr->prev = temp; } ``` --- ### 总结 双向链表的逆序操作本质上是对链表中每个节点的指针进行重新定向。与单链表相比,双向链表提供了更多的灵活性,能够同时调整 `next` 和 `prev` 指针[^3]。上述代码展示了如何通过指针交换实现链表的逆序,并且适用于普通双向链表和双向循环链表。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值