链表定义如下:
struct Node
{
struct Node* next;
int data;
};
非递归反置链表如下:
struct Node* ll_reverse(struct Node* head)
{
if(head==NULL)
{
return NULL;
}
else
{
struct Node* pre = NULL;
struct Node* next = NULL;
struct Node* ptr =[......]
Leave a reply
判断链表是否相交(无环版)
数据结构重读 – 回溯法与树的遍历 (幂集问题 八皇后问题)
有许多问题,可以利用试探和回溯的搜索技术求解。
求解的过程实际是先序遍历一棵“状态树”的过程。
例1:有集合A = {1, 2, ...n},求A的全部子集。
思路:从求全部子集(幂集)这个事情上,实际上对每个元素只有两个状态:要么在一个子集中,要么不在。
因此,可以逐一对A中每个元素进行“取”和“舍”,从而构造一棵完全二叉树。
算法如下:
注意这里是1~n,不是0~n
void mj(int n, int pos, int* flag)
{
i[......]
查找最小的k个元素
给定一个数组和一个k,输出最小的k个数字。
这个问题有多重解法,譬如:
1、sort, top K,时间复杂度O(nlogn)
2、小顶堆排序,pop+调整k次,时间复杂度O(n+klogn)。
3、选择排序,每次选min,swap到头部时间复杂度O(nk)。
这里写下选择排序这个。
#include <stdio.h>
void select_min(int* arr, int n, int k)
{
int i, j, tmp;
int min[......]
在二叉树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如:
10
/ \
5 12
/ \
4 7
输入整数22,输出如下路径:
10 12
10 5 7
解:就是最简单的先序遍历,只不过要记录路径,可以使用数组,我这里用的stl::vector。
注意left和right遍历后,要回退当前结点在path中状态。
算法:
v[......]
