目的
这一系列博客的目的在于复习巩固数据结构的基础知识,为考研面试笔试做准备,所以重在原理,代码实践不是重点。
参考书籍有严蔚敏老师的《数据结构(C语言版)》,《C/C++数据结构与算法速学速用大辞典》
线性表
顺序表
单链表
- 合并有序单链表
注意插入顺序。如果需要合并的有序链表是按照从小到大顺序排列,合并是按从大到小顺序合并。采用遍历有序链表,按照先插入小的,这样每次都只需要从头结点后面插入。
- 合并有序单链表
循环链表
- 判断条件
双向链表
- 插入删除
//将s结点插入p结点之前
s = (DListNode*)malloc(sizeof(DListNode));
if(!s)
return -1;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
//删除p结点
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
- 约瑟夫问题
N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
- 模拟法
利用循环链表或者双向链表模拟一圈人;报数杀人;循环直到最后一个人。 - 递归法
将n个人编号为0~n-1。第一个出局的人编号是m%n -1;剩下的n-1个人组成了一个新的约瑟夫环,以编号为k=m%n的人开始
- 模拟法
出局0人 序号 | 出局0人 数列 | 出局1人 序号 | 出局1人 数列 |
---|---|---|---|
0 | 0 | (n-1)-m+1 | 0 |
1 | 1 | (n-1)-m+2 | 1 |
… | … | … | … |
m-1 | m-1 | ||
m | m | 0 | m |
m+1 | m+1 | 1 | m+1 |
… | … | … | … |
x | x | x-m | x |
… | … | … | … |
n-2 | n-2 | (n-2)-m | n-2 |
n-1 | n-1 | (n-1)-m | n-1 |
假设第x个数是n个数的解,第x-m个数(n-1)时
F(n) = ( F(n-1) + m ) % n;//考虑到循环,取模
int F[n];//F[i]表示剩余i个人的情况
F[1] = 0;//只剩一个数,这个数序号为0,也就是游戏顺利的那个数
for(i=2; i<=n; i++)
F[i] = ( F[i-1] + m ) % i;//剩余i个数的情况是对i取余
cout<<"winner:"<<F[n]<<endl;
- C/C++ STL vector代码解析
未完待续