根据提供的文件内容,我们可以归纳出以下关键算法知识点: ### 1. 反转单链表 **描述**:本算法实现单链表的反转。 **思路解析**: 1. **初始化指针**:首先初始化两个指针 `p` 和 `p1`,其中 `p` 指向链表头节点,`p1` 指向下一个节点。 2. **遍历链表**:使用 `while` 循环遍历整个链表,将当前节点的 `next` 指向前一个节点,使链表反转。 3. **更新指针**:每次循环结束后更新 `p` 和 `p1` 的指向,直至遍历结束。 **代码示例**: ```c++ p2 = nullptr; p = head; p1 = p->next; while (p1 != nullptr) { p2 = p1->next; p1->next = p; p->next = nullptr; p = p1; p1 = p2; } ``` ### 2. 二叉树的前序遍历 **描述**:此算法实现二叉树的前序遍历(根左右)。 **思路解析**: 1. **初始化栈**:创建一个栈 `ss` 并将根节点入栈。 2. **迭代处理**:使用 `while` 循环来处理栈中的节点,直至栈为空。 3. **访问节点**:在循环中,先访问当前节点,然后将其左子节点入栈,若无左子节点则弹出栈顶元素并访问其右子节点。 **代码示例**: ```c++ Stack ss; ss.push(root); Node* p = root; while (!ss.empty()) { while (p->left != nullptr) { p = p->left; ss.push(p); } p = ss.pop(); visit(p); if (p->right != nullptr) { p = p->right; ss.push(p); } } ``` ### 3. 合并两个有序链表 **描述**:该算法合并两个已排序的链表为一个新的有序链表。 **思路解析**: 1. **初始化指针**:比较两个链表头部节点值的大小,并设置初始合并链表的头节点。 2. **遍历链表**:遍历两个链表,将较小值节点添加到合并后的链表。 3. **处理剩余节点**:如果其中一个链表遍历完后,另一个链表还有剩余节点,则将这些节点依次添加到合并后的链表尾部。 **代码示例**: ```c++ Node* merge(Node* link1, Node* link2) { Node* p = link1->data <= link2->data ? link1 : link2; Node* p1 = link1->data > link2->data ? link1 : link2; while (p->next != nullptr && p1 != nullptr) { while ((p->next != nullptr) && (p->next)->data < p1->data) { p = p->next; } Node* temp = p->next; p->next = p1; p = p1; p1 = temp; } if (p->next == nullptr) p->next = p1; return p; } ``` ### 4. 合并两个有序数组 **描述**:此算法将两个已排序的整数数组合并成一个新数组。 **思路解析**: 1. **初始化指针**:初始化三个指针 `i`, `j`, `k` 分别用于遍历第一个数组、第二个数组和新数组。 2. **比较并合并**:遍历两个数组,将较小值放入新数组。 3. **处理剩余元素**:若其中一个数组遍历完毕,则将另一个数组剩余部分复制到新数组末尾。 **代码示例**: ```c++ void merge(int a[], int b[], int alen, int blen) { int* c = new int[alen + blen]; int i = 0, j = 0, k = 0; while (i < alen && j < blen) { if (a[i] <= b[j]) { c[k++] = a[i++]; } else { c[k++] = b[j++]; } } while (i < alen) c[k++] = a[i++]; while (j < blen) c[k++] = b[j++]; } ``` ### 5. 二分查找 **描述**:该算法实现二分查找法,在有序数组中查找特定值。 **思路解析**: 1. **初始化边界**:设定搜索范围的起始与结束位置。 2. **计算中间位置**:计算中间位置索引。 3. **比较目标值**:将目标值与中间位置的元素进行比较,决定搜索方向。 4. **递归查找**:若未找到目标值,则继续在一半的区间内查找。 **代码示例**: ```c++ int find(int a[], int start, int end, int data) { if (start > end) return -1; int mid = (start + end) / 2; if (data == a[mid]) return mid; else if (data < a[mid]) return find(a, start, mid - 1, data); else return find(a, mid + 1, end, data); } ``` ### 6. 随机洗牌算法 **描述**:此算法用于对数组进行随机洗牌。 **思路解析**: 1. **初始化**:从数组的第一个元素开始遍历。 2. **随机交换**:对于每一个元素,随机选择一个位置与其交换。 3. **重复步骤**:直到所有元素都处理过一次。 **代码示例**: ```c++ int washCard(int a[], int len) { int start = 0; while (start < len) { int rand = random(start, len - 1); int temp = a[start]; a[start] = a[rand]; a[rand] = temp; start++; } } ``` ### 7. 全排列 **描述**:本算法实现全排列,即找出数组的所有可能排列。 **思路解析**: 1. **初始化标志位**:定义一个数组 `isUsed[]` 来记录数字是否被使用过。 2. **递归实现**:递归地生成全排列。 3. **回溯恢复**:在递归返回时恢复 `isUsed[]` 数组的状态。 **代码示例**: ```c++ int isUsed[len] = {0}; void function(int a[], int len, int pos) { if (pos == len) { print(a); } for (int i = 0; i < len; i++) { if (!isUsed[i]) { a[pos] = i + 1; isUsed[i] = 1; function(a, len, pos + 1); isUsed[i] = 0; } } } ``` ### 8. 最大公约数算法 **描述**:此算法用于求解两个整数的最大公约数。 **思路解析**: 1. **初始化**:定义两个变量 `a` 和 `b` 表示输入的整数。 2. **辗转相除法**:使用辗转相除法计算最大公约数。 3. **循环计算**:当余数不为零时,继续用 `b` 和余数 `c` 作为新的 `a` 和 `b` 进行计算。 4. **返回结果**:余数为零时,`b` 即为最大公约数。 **代码示例**: ```c++ int function(int a, int b) { int c = 0; while (true) { c = a % b; if (c == 0) break; a = b; b = c; } return b; } ``` ### 9. 冒泡排序 **描述**:该算法实现冒泡排序算法,对数组进行升序排序。 **思路解析**: 1. **初始化**:定义两个嵌套循环,外层循环控制比较轮数,内层循环负责比较并交换相邻元素。 2. **比较交换**:如果前一个元素大于后一个元素,则交换它们的位置。 **代码示例**: ```c++ void sort(int a[], int len) { for (int i = 0; i < len; i++) for (int j = 0; j < len - i - 1; j++) if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } ``` ### 10. 快速排序 **描述**:此算法实现快速排序算法,对数组进行排序。 **思路解析**: 1. **初始化**:设定起始和结束位置。 2. **选取基准值**:选择数组中的一个元素作为基准值。 3. **分区操作**:将小于基准值的元素放在左边,大于基准值的元素放在右边。 4. **递归调用**:递归地对左右两边的子数组进行快速排序。 **代码示例**: ```c++ void QuickSort(int a[], int low, int high) { if (low < high) { // 分区操作 int pivotIndex = partition(a, low, high); // 对左侧子数组进行排序 QuickSort(a, low, pivotIndex - 1); // 对右侧子数组进行排序 QuickSort(a, pivotIndex + 1, high); } } ``` 以上就是从给定的文件内容中提取出来的关键算法知识点。这些算法是计算机科学的基础,也是很多编程面试中常见的问题类型。理解并掌握这些算法能够帮助求职者在技术面试中取得更好的成绩。
p=head;
p1=p->next;
while(p1)
{
p2=p1->next;
p1->next = p;
p->next = NULL;
p=p1;
p1=p2;
}
2.二叉树遍历非递归算法(中序)
思路:1.根进栈。
2.左子树循环进栈。
3.从栈中pop出一个元素。
4.把右子树的一个元素进栈。
Stack ss;
ss.push( root );
p = root;
while(!ss.empty())
{
while(p->left)
{
p = p->left;
ss.push(p);
}
p = ss.pop();
if (p->right)
{
p=p->right;
ss.push(p);
}
}
3.有序链表的合并
p = link1->data <= link1->data ? link1; link2;
p1 = link1->data > link1->data ? link1; link2;
while(p->next && p1)
{
while( (p->next) && (p->next)->data < p1->data )
{
p = p->next;
}
temp = p->next;
p->next = p1;
p = p1;
p1 = temp;
}
if (p->next == NULL)
p->next = p1;
4.有序数组合并
void merge( int a[]; int b[], int alen; int blen )
剩余8页未读,继续阅读
- 知行力2014-06-06很基础 适合初学者
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 所有算法均用 Python 实现.zip
- redis-standalone.yml redis k8s单点部署
- Python基于Scrapy兼职招聘网站爬虫数据分析设计(源码)
- zipkin.yml zipkin k8s部署
- YY9706.102-2021医用电气设备第2-47部分
- 通过运用时间序列ARIMA模型与循环神经网络(LSTM)对中国包装机器数量进行预测(python源码)
- Ruby编程基础与进阶指南
- 基于ARIMA模型的股票预测(python源码)
- 基于阿里云对象存储的对文件进行批量修改、批量解冻、批量上传
- 山东联通-海信IP501H-GK6323V100C-1+8G-4.4.2-当贝桌面-卡刷包