1.仅有头指针,查找输出倒数第k个元素。

基本思想是设置两个指针p、q均指向链表的第一个数据结点,p沿着链表移动,q先不动,设置一个计数器count初值为0,count随着p的移动而增加,当count的值为k时,p和q一起移动,当p移动到最后一个结点时,q指针所指的就是倒数第k个结点。可以自己画个图出来试试。仅仅遍历一遍就找到了元素k。最容易想到的办法就是,直接遍历一遍,数出有多少个元素,然后再根据元素位置去查找,这样会至多增加一半的时间复杂度。算法效率不高。

typedef in ElemType;
typedef struct LNode{ElemType data;struct Lnode *next;
}*LinkList;int Search_k(LinkList list, int k)
{//查找链表的倒数第k个结点并输出LinkList p=list->next,q=list->next;int count=0;while(p!=NULL){if(count<k) count++;else q=q->next;p=p->next;  //注意这个地方p=p-next;语句不在判断之中始终执行}if(count<k)return 0;else {printf("%d",q->data);return 1;}
}

2.将有n(n>1)个整数的数组R中保存的数据循环左移P位。

基本思想是将数组分为两部分,两部分分别逆序,再整体逆序即为所得

void Reverse(int R[],int from,int to){int i, temp;for(i=0;i<(to-from+1)/2;i++){temp=R[from+i];R[from+i]=R[to-i];R[to-i]=temp;}
}void Converse(int R[], int n,int p)
{Reverse(R,0,p-1);Reverse(R,p,n-1);Reverse(R,0,n-1);
}//算法时间复杂度为O(n),空间复杂度为O(1)

3.求两个有序序列合起来的中位数。

基本思想是根据归并后的结果来判断,设A序列的中位数为a,B序列的中位数为b。如果原先的两个序列中位数相等,那么合并之后的中位数一定是a或者b,容易理解,因为归并后的序列 原先排在ab前面的数归并后一定排在ab的前面,原先排在ab之后的数归并后一定排在ab的后面,ab一定是位于整个序列的中间,那么归并后的中位数一定是a或者b。
如果a<b,那么中位数一定位于序列a到b之间的某个数,因此可以将a之前的数和b之后的数舍弃掉,再从a到b之间去找,同样的可以再从两部分序列中分别找出中位数再比较,重复下去,直到两个序列只含有一个元素为止,则较小的即为所求的中位数。
如果a>b,那么中位数一定位于b到a之间的某个数,因此可以将b之前的数舍弃掉,a之后的数舍弃掉,从a,b之间去找,再剩下的序列中重复上述过程,直到两个序列中只有一个元素,则较小的为中位数。

注意,这里只是假定序列归并了,如果真的归并有序了那么中位数肯定就是数组中间的数,就不用麻烦这么半天了,这样做虽然算法简单,但是效率不高。

int M_Search(int A[],int B[],int n)
{int s1=0,d1=n-1,m1,s2=0,d2=n-1,m2;while(s1!=d1 || s2!=d2){m1=(s1+d1)/2;m2=(s2+d2)/2;if(A[m1]==B[m2])return A[m1];if(A[m1]<B[m2]){if((s1+d1)%2==0){s1=m1;d2=m2;}else{s1=m1+1;d2=m2;}}else{if((s1+d1)%2==0){d1=m1;s2=m2;}else{d1=m1+1;s2=m2;}}}return A[s1]<B[s2]? A[s1]:[s2];
}
//算法的时间复杂度为O(nlog2n),空间复杂度为O(1)

4.找两个链表的公共链表的起始位置,这两个链表的末端指向了同一个链表。

基本思想是先遍历两个链表求出链表长度,让两个链表末端对齐,对于更长的链表,指针可以先多移动m-n个距离,让两个指针平齐,然后两个指针一起向后遍历,反复比较它们指向的结点的next指针是否相同,若相同则找到。

LinkNode *Find_lst_Common(LinkList str1,LinkList str2)
{int len1=Length(str1),len2=Length(str2);LinkNode *p,*q;for(p=str1;len1>len2;len1--)p=p->next;for(q=str2;len1<len2;len2--)q=q->next;while(p->next!=NULL && p->next!=q->next){p=p->next;q=q->next;}return p->next;
}

数据结构算法题整理4相关推荐

  1. 43. 盘点那些必问的数据结构算法题之二叉树基础

    盘点那些必问的数据结构算法题之二叉树基础 0 概述 1 定义 2 基本操作 1) 创建结点 2) BST 插入结点 3) BST 删除结点 4) BST 查找结点 5)BST 最小值结点和最大值结点 ...

  2. 41. 盘点那些必问的数据结构算法题之链表

    盘点那些必问的数据结构算法题之链表 0 概述 1 定义 2 基本操作 3 链表相关面试题 3.1 链表逆序 3.2 链表复制 3.3 链表合并 3.4 链表相交判断 3.5 判断链表是否存在环 3.6 ...

  3. 42. 盘点那些必问的数据结构算法题之二叉堆

    盘点那些必问的数据结构算法题之二叉堆 0 概述 1 二叉堆定义 2 保持堆的性质 3 建立最大堆 4 堆排序 5 优先级队列 参考资料 0 概述 本文要描述的堆是二叉堆.二叉堆是一种数组对象,可以被视 ...

  4. 数据结构与算法题整理

    未经各位前辈允许,擅自整理,还望谅解.感激不尽. ↓↓↓↓一一一2016.9.23 如何计算时间复杂度 平均查找长度详解 ↓↓↓↓一一一2016.9.15 找工作知识储备(3)---从头说12种排序算 ...

  5. LeetCode算法题整理(200题左右)

    目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...

  6. 校招面试中常见的算法题整理【长文】

    ⭐️我叫恒心,一名喜欢书写博客的研究生在读生. 原创不易~转载麻烦注明出处,并告知作者,谢谢!!! 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧. 文章目录 前言 一.链表 ...

  7. java无序数组找最长连续子串,算法题整理

    链表: 一个单链表,奇数位升序,偶数位降序,输出排序后的单链表.(写了个归并,拆成两个单链表并且把偶数位做头插翻转过来,再归并到一起.) 链表节点两两反转 奇偶链表 单向链表,头尾奇偶交替输出(中等) ...

  8. 面试中常见的数据结构与算法题整理,想当架构师,数据结构与算法不过关可不行(数组+字符串,共60题)

    [Java架构师面试网]收集整理了一些Java面试的常见问题,这些问题可能会在你下一次技术面试中遇到.想成为Java架构师,这些都是不可避免也是必须要掌握的哦,对于其他模块的面试题,我后续也将单独分享 ...

  9. 数据结构算法题:回文数的实现

    回文是指正读反读均相同的字符序列,如'abba'和'abdba'均是回文,但'good'不是回文.试写一个算法判断给定的字符序列是否为回文 (提示:将一半的字符入栈) 思路: 从题目可知,题目要求我们 ...

  10. 盘点那些必问的数据结构算法题之链表

    0 概述 链表作为一种基础的数据结构,在很多地方会用到.如在Linux内核代码,redis源码,python源码中都有使用.除了单向链表,还有双向链表,本文主要关注单向链表(含部分循环链表题目,会在题 ...

最新文章

  1. Apache2.4+Tomcat7集群搭建
  2. 【转】Android开发之数据库SQL
  3. python中初始化方法_Python中类的初始化特殊方法
  4. java判断接口对象是哪个子类_Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例。...
  5. 计算机二合一二级基础知识软件,全国计算机等级考试笔试+上机题库二合一二级Visual FoxPro...
  6. opencv︱图像的色彩空間cvtColor(HSV、HSL、HSB )及相关色彩学
  7. 191030_Lda主题模型
  8. 【转】404、500、502等HTTP状态码介绍
  9. Jackson 格式化日期问题
  10. TimesTen In-Memory Database
  11. python-pptx---插入表格
  12. 安卓手机解锁密码忘了如何解锁
  13. 【绝知此事要躬行】线性表之链表OJ(上)
  14. 博士申请 | 帝国理工学院Stefan Vlask教授招收机器学习方向全奖博士生
  15. 直线型一阶倒立摆3---控制器设计
  16. VB 清除数组中全部元素的值
  17. 在立创商城上快速制作PCB原理图库
  18. c语言选择结构作用,c语言选择结构程序设计教案
  19. charles系列破解激活办法(最高charles4.2都可以激活)
  20. python安装xgboost的方法

热门文章

  1. C#如何生成随机不重复的数字
  2. 3月10日 QR分解求非齐次线性,SVD分解求齐次线性最小二乘
  3. Accurate, Large Minibatch SGD
  4. 第三季-第18课-共享内存通讯
  5. Java 并发和多线程(一) Java并发性和多线程介绍[转]
  6. 数据批量删除_从页面js到后台数据库
  7. 怎样调整服务器C盘空间
  8. BZOJ 1677. [Usaco2005 Jan]Sumsets 求和
  9. (转)DB2 db2diag.log 日志分析
  10. 软件工程第二次作业——个人项目