数据结构
yuzhang_zy
现在的我不是最好的我,未来的我才是最好的我,每一篇博客都记录着我的成长
展开
-
翻转链表(非递归)
1. 问题描述:给出一个链表,翻转链表,返回翻转后链表的头结点2. 我们也可以使用非递归的方式来进行翻转链表,首先遍历链表,使用一个指针pre记录当前节点的前一个节点,使用当前节点的next指向前一个节点pre,即下一个元素的指针next指向前一个元素pre那么就实现了链表的翻转这里特别要注意的是pre.next不能赋值为空,当第一个元素的时候倒是没有关系,但是在循环后面的元素pre是...原创 2018-12-02 10:45:32 · 201 阅读 · 0 评论 -
链表的加法(递归)
1. 问题描述:有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)测试样例:{1,2,3},{3,2,1}返回:{4,4,4}{7,4,0,7,5},{2,7,2,3,4}返回:{9,1,...原创 2018-11-30 21:33:16 · 2270 阅读 · 1 评论 -
求出有环链表的起点
1. 问题描述:给定一个有环的链表,实现一个算法返回环路的开头节点有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路2. 这个我们使用到了一个对于判断是否有重复元素非常有效的数据结构:HashSet,遍历链表判断当前的HashSet中是否有当前指针指向的元素,如果没有则加入当前元素,如果有那么直接返回这个节点的指针就可以了3. 具体的代码如下...原创 2018-12-01 17:49:59 · 295 阅读 · 0 评论 -
判断一个链表是否有环(快慢指针)
1. 问题描述:给出一个链表判断该链表是否有环2. 我们可以使用一种比较经典的方式来进行处理,就是使用两个指针来进行移动,一个为快指针,一个为慢指针,快指针一次移动两步,慢指针一次移动一步,假如链表有环的话那么这两个指针一定会在某一个地方会相遇的,为什么呢?有没有可能不会相遇呢?答案是不可能的,两个指针一定会在某一个位置上相遇,因为假如它们没有相遇,快指针的位置为i + 1,那么慢指针的位...原创 2018-12-01 19:07:44 · 3582 阅读 · 1 评论 -
求出有环链表的起点(快慢指针)
1. 问题描述:给定一个有环的链表,实现一个算法返回环路的开头节点有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路要求:不能够使用额外的空间来进行记录2. 题目与之前不一样的是不能够开辟额外的空间来进行记录,所以我们是不能够使用HashSet来判断哪个节点存在着重复,只能通过另外的方法来进行求解这里使用到的又是一个非常经典的做法,定义...原创 2018-12-01 19:29:43 · 353 阅读 · 0 评论 -
翻转链表(递归)
1. 给出一个链表,翻转链表,返回翻转后链表的头结点2. 因为涉及到翻转链表所以应该从链表的末尾开始改变指针的指向,而递归这种方法就很好地诠释了这一点,因为递归碰到递归出口之后那么是层层返回的,而且它是从末尾开始返回的,对于这道题目来说是从链表的末尾的节点开始返回的,所以这个时候使用递归来求解就非常合适了,在碰到递归出口之后进行层层返回修改每一个节点的next指针的指向即可翻转整个链表,最后返...原创 2018-12-01 22:24:33 · 2291 阅读 · 0 评论 -
队列
1. 问题网址:http://lx.lanqiao.cn/problem.page?gpid=T418问题描述:问题描述 队列操作题。根据输入的操作命令,操作队列(1)入队、(2)出队并输出、(3)计算队中元素个数并输出输入格式 第一行一个数字N 下面N行,每行第一个数字为操作命令(1)入队、(2)出队并输出、(3)计算队中元素个数并输出输出格式 若干行...原创 2019-02-17 20:45:51 · 204 阅读 · 0 评论 -
表达式的计算(后缀表达式的求解)
1. 问题网址:http://lx.lanqiao.cn/problem.page?gpid=T419问题描述:问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除输入格式 输入一行,包含一个表达式输出格式 输出这个表达式的值样例输入1-2+3*(4-5)样例输出-4数据规模和约定 表达式长度不超过100,...原创 2019-02-18 20:32:48 · 24357 阅读 · 3 评论 -
翻转链表(非递归)
1. 使用非递归的方式来翻转链表链表逆序的本质就是把每一个节点原本指向下一个节点的next指针倒转过来,指向它的前置节点,如果从链表的某个节点来看要把它的next指针倒转,我们最少需要同时知道三个节点,因为我们需要知道当前节点的前一个节点,后一个节点以及节点本身这样,后一个节点是因为我们在把当前节点的next指向前一个节点的之后,假如没有保存后一个节点的引用那么后一个节点就找不到了需要经过...原创 2019-02-20 22:49:29 · 301 阅读 · 0 评论 -
素因子去重
1. 问题描述:问题描述 给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1输入格式 一个整数,表示n输出格式 输出一行,包含一个整数p。样例输入1000样例输出10数据规模和约定n<=10^12样例解释:n=1000=2^3*5*3,p=2*5=102. 思路分析:① 这道题目主...原创 2019-03-07 18:13:41 · 706 阅读 · 0 评论 -
括号匹配
1. 问题描述:括号配对问题时间限制:3000 ms | 内存限制:65535 KB难度:3描述现在,有一行括号序列,请你检查这行括号是否配对。输入第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]",...原创 2019-03-12 12:24:05 · 247 阅读 · 0 评论 -
对集合中的对象进行排序(Comparable接口与Comparator接口)
1. 有的时候需要对集合中的对象进行排序,其中有两种方法可以对集合中的对象按照某种自定义的规则来进行排序① 方法一:在集合的元素(对象)中实现Comparable接口首先要创建一个User对象, 并且实现Comparable接口package ListDemo;//注意User对象上面不能够写<User>否则后面会导致传进去的对象不能够调用get方法public cl...原创 2018-11-29 10:05:05 · 2611 阅读 · 0 评论 -
使用基准值对链表进行分区
1. 问题描述:编写代码,以给定值x为基准将链表分为两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头结点 ListNode * pHead,请返回重新后的链表的头指针注意:分割以后原来的数据顺序不变不要开辟新的空间,即不要新建节点2. 我们可以定义几个指针把给出的链表分为两部分,左边的链表元素值小于x,右边链表元素值大于等于x,扫描整个链表进行判断当前元素应该加入的...原创 2018-11-30 19:22:48 · 411 阅读 · 0 评论 -
单链表与数组实现线性表的性能比较
1. 在不同的操作情况两者的性能不尽相同,下面是具体的对比:① 对于空间上的要求链表会需要更多一点的空间,因为不仅要存储数据,而且要存储下一个节点的地址,所以需要消耗一些额外存储下一个节点的空间数组是元素是多少那么整个需要开辟的空间就是多少,不需要开辟额外的空间② 新增元素操作链表是直接插入到链表中就可以了,不用考虑什么边界上的问题,时间复杂度为O(1),但是对于数组而言是要考...原创 2018-11-27 21:51:26 · 651 阅读 · 0 评论 -
单链表的形式实现列表(线性表)
1. 我们可以使用数组和链表来实现列表(线性表),下面使用Java语言来实现单链表2. Java中是没有指针的,但是Java中有引用,所以我们可以使用引用来代表一个指针,指向的是一个地址,所以这里是跟C语言链表不用的一个点① 首先我们先创建一个ListNode类,这个类代表着链表的一个节点,我们可以在这个类中封装一些属性,包括节点的数据和下一个节点的引用public class Li...原创 2018-11-27 21:11:40 · 649 阅读 · 0 评论 -
判断链表是否为回文链表
1. 问题描述:给出一个链表,判断该链表是否为回文链表2. 解决的方法有两种,一种是将链表进行翻转(这里可以使用递归来解决)然后翻转后的后半部分与链表的前半部分进行比较来进行判断,第二种是将先找到链表的中间位置,这里可以使用快慢指针指针来进行,快指针一次走一步,慢指针一次走两步,那么等到快指针走到末尾的时候那么慢指针的位置是链表的中间位置,在求出中间位置的时候对慢指针指向的元素进行压栈,等...原创 2018-12-02 11:44:54 · 4424 阅读 · 0 评论 -
基于链表实现的桶排序
1. 问题描述:使用桶排序算法对控制台输入的数字进行排序2. 桶排序涉及到几个问题:① 桶的大小,这里我们可以根据输入的元素的个数来确定桶的大小② 怎么样确定当前元素进入哪一个桶,这里我们使用到的是通过一个哈希函数来进行计算int index = (element * length) / (max + 1);element为当前元素的值,length为桶的大小,max为数...原创 2018-11-29 13:54:44 · 1182 阅读 · 0 评论 -
使用哈希表(HashSet)删除链表中的重复元素
1. 删除链表中的重复元素我们可以使用两种方法去解决:① 一种是利用哈希表(HashSet),哈希表特别适合于判断集合中是否有重复的元素② 第二种方法是直接使用遍历链表,使用两层for循环去遍历再来找出重复的元素,下面使用哈希表来寻找重复的元素2. 首先我们要解决几个问题①如何利用数组来生成一个链表,这里我们可以构建一个哑元(空的节点)来进行数组中每个元素作为节点的生成②...原创 2018-11-29 20:19:05 · 3260 阅读 · 0 评论 -
双层循环遍历链表删除重复元素
1.删除链表中的重复元素,要求是不能够使用缓冲区由于题目要求了不能够使用额外的空间来进行辅助我们找出重复的元素,即不能够使用额外的数据结构来保存元素,所以我们不能够使用哈希表(HashSet)来辅助我们找出重复的元素了,但是我们可以普遍的做法:使用双重循环来找出重复的元素在链表中一般是使用while循环而不使用for循环来遍历元素其中要使用到四个指针,第一个指针first指向的是第一...原创 2018-11-29 21:06:41 · 1381 阅读 · 2 评论 -
找出链表中倒数第k个节点(双型指针)
1.实现一个算法,找出单向链表中倒数第k个节点(这是CC150的一道题目)2. 从题目可以看出,只是给出了链表的头结点,所以我们是不知道链表中含有几个元素,假如知道几个元素的话我们就比较好处理了,可以使用一个计数变量来记录我们需要遍历多少次我们才可以找到倒数第k个节点,但是麻烦就在这里,只知道头结点,这里我们使用非常有技巧性的做法就是使用两个指针(双型指针)来进行移动,指针分别是p1,p2,...原创 2018-11-30 10:33:23 · 478 阅读 · 0 评论 -
删除单向链表中给出的第k个节点
1. 问题描述:实现一个算法,删除单向链表中的某个节点,假定你只能访问该节点给出一些限定条件才能够使到题目更完备一些:给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true输入单向链表a->b->c->d->e中的c,结果不返回任何数据,单链表变为a->b->d->e2. 题目中限定了只能访问该节点,那么之前的...原创 2018-11-30 11:30:48 · 2915 阅读 · 0 评论 -
猫狗收容所(队列)
1. 问题描述:有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。给定一个操作序列int[][2] ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为...原创 2018-12-04 19:30:09 · 2158 阅读 · 0 评论 -
队列
1. 栈的定义队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表,进行插入操作的端称为队尾,进行删除操作的端称为队头2. 在jdk中栈是一般是使用LinkedList来进行实现的,主要的方法有入队add(),出队poll(),查看队首元素peek()方法,判断队列中是否还有元素isEmpty()impo...原创 2018-12-04 19:51:44 · 143 阅读 · 0 评论 -
栈的排序
1. 问题描述:请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。给定一个int[] numbers(C++中为vector&ltint>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。测试样例:[1,2,3,4,5]返回:[5,4,3...原创 2018-12-04 20:38:51 · 5495 阅读 · 1 评论 -
两个栈实现队列
1. 问题描述:实现一个MyQueue类,该类用两个栈来实现一个队列(题目是cc150上的一道题目)2. 使用两个栈来实现一个队列其实使用到了另外的一个栈对于数据的缓冲作用,我们可以这样想:在入栈的时候直接压入堆栈即可,在弹出堆栈的时候此时需要借助于另外一个堆栈来进行缓冲,把第一个堆栈的元素全部压入到第二个堆栈中然后弹出第二个堆栈的栈顶元素这样就完成了队列先进先出的要求,然后再把第二个堆栈...原创 2018-12-04 21:13:01 · 242 阅读 · 0 评论 -
栈
1. 栈的定义:栈又名堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素2. jdk中实现的栈的方法主要是入栈方法push(),出栈方法po...原创 2018-12-04 21:23:41 · 187 阅读 · 0 评论 -
C语言实现将两个递增有序的链表合并成一个非递减有序链表
1. 问题描述:A和B是两个单链表(带有表头节点),其中元素是递增有序的,设计一个算法,将A和B归并成一个按元素值非递减有序的链表C,C由链表A和B的节点组成2. 思路分析:① 因为A和B都是递增有序的,要使归并后的链表还是有序的,可以从A和B中挑选出最小的元素,插入到C的尾部,这样当A和B中的元素都插入到C中的时候一定是有序的,所以需要定义两个指针分别指向链表A和链表B,这样才可以对...原创 2019-06-29 09:30:21 · 7174 阅读 · 0 评论