![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Ghost__s
这个作者很懒,什么都没留下…
展开
-
【剑指offer】链表中倒数第K个节点
输入一个链表,输出该链表中倒数第k个结点struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};class Solution {public: ListNode* FindKthToTail(ListNode* pListHead,...原创 2020-02-07 20:13:47 · 158 阅读 · 0 评论 -
一个数组实现两个栈(共享栈)
思路:一个数组实现两个栈,简单的来想就是要把一个数组分成两部分方式一:下标为0的位置是stack1的栈底,下标为1的位置是stack2的栈底,stack1的元素放在下标为偶数的位置,stack2的元素放在下标为奇数的位置。这种分法有一个缺点就是容易造成空间浪费,假如stack1只有2个元素,而stack2有10个元素,最后使用的总空间还是20,但其实只存了12个元素。方式二...原创 2019-05-13 16:59:54 · 1368 阅读 · 0 评论 -
【栈和队列面试题】两个队列实现一个栈
分析:将queue1用作进栈出栈,queue2作为一个中转站入栈时,直接压入q1中出栈时,先将q1中的元素除最后一个元素外依次出队列,并压入队列q2中,将留在q1中的最后一个元素出队列即为出栈元素,最后还要把q2中的元素再次压入q1中//QStank.h#pragma once#include "Queue.h"//两个队列实现一个栈typedef struct...原创 2019-05-07 22:44:49 · 337 阅读 · 0 评论 -
【栈和链表面试题】使用两个栈实现一个队列
分析:思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接...原创 2019-05-07 22:33:46 · 396 阅读 · 0 评论 -
【栈和队列面试题】实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1)
问题描述:实现一个栈,要求Push(入栈),Pop(出栈),Min(返回最小值的操作)的时间复杂度为O(1)//MinStack.h#pragma once#include "Stack.h"#include <assert.h>//最小栈// 初始化// Push/Pop/Top/Min 要求 O(1)typedef struct MinStack {...原创 2019-05-07 21:43:17 · 486 阅读 · 0 评论 -
顺序栈的相关操作(C语言)
//Stack.h#pragma once#define MAX_SIZE 100typedef char StackDataType;typedef struct Stack { StackDataType array[MAX_SIZE]; int top; //表示当前个数}Stack;// 初始化/销毁// 增(只能从栈顶)/删(只能删除栈顶)/查(只能查看栈顶元...原创 2019-05-10 12:59:11 · 361 阅读 · 0 评论 -
元素出栈、入栈顺序的合法性
问题描述:判断元素出栈、入栈顺序的合法性。如入栈的序列“abcde”,出栈序列为“deabc”思路:定义两个数组分别来存放入栈和出栈序列 步骤1:先将字符串1的第一个字符入栈:步骤2:将该元素与字符串2的第一个元素进行比较步骤3:a):如果相等,就将该元素出栈并且将字符串1的下一个字符入栈,与字符串2的下一个字符进行比较。b):如果不相等,继续将字符串1的下一个字符入栈,继续...原创 2019-05-10 12:53:05 · 1042 阅读 · 0 评论 -
判断单链表是否带环?若带环,求环的长度?求环的入口点
问题一:如何判断链表是否带环?思路:利用快慢指针,定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走的快的指针追上了走的慢的指针,那么链表就包含环;如果走的快的指针走到了链表的末尾都没有追上另一个指针,那么链表就不包含环。 //判断单链表是否带环?ListNode* ListIsCircle(ListNode* first){ if (fir...原创 2019-04-27 19:58:15 · 338 阅读 · 0 评论 -
逆置/反转单链表
问题描述 : 给出一个单链表的头节点,反转改链表思路: 1、在原链表上做改动,由于是单链表,所以在将B指向前一个A节点后,链表会出现断裂的情况,导致我们之后就无法遍历到节点C,为了避免这种情况,我们要在调整节点B之前,把C节点保存下来。,因此需要定义三个指针。分别指向当前遍历到的节点,它的前一个节点,和后一个节点。//逆置/反转单链表 ListNode* ReserveL...原创 2019-04-27 19:21:35 · 411 阅读 · 1 评论 -
单链表实现约瑟夫环(JosephCircle)
以五个节点的带环单链表(最后一个节点指向第一个节点)为例子假设K为2的情况下: 1 从链表头开始,先删除第二个节点 2 从删除节点的下一个节点开始,再往后找第二个节点,然后删除。 3 一直重复过程2,直到剩下一个节点,返回该节点。ListNode* JosephCircle(ListNode* first, int k){ if (first ...原创 2019-04-25 22:48:45 · 802 阅读 · 0 评论 -
从尾到头打印链表(经典面试题)
从尾到头打印单链表 思路:自己画一个简单的链表有助于理解,先来分析打印一次的过程,cur 是用来遍历链表用的。就这个题来说,我么们首先要打印5,也就是当cur->next = NULL时,打印cur->data的值。第二次,要打印4,也就是当cur->next = 5。所以我们需要用一个指针记录每一趟的结尾,并且每一趟都需要从头开始,所以需要一个指针记录头的位置。下...原创 2019-04-25 20:52:18 · 430 阅读 · 0 评论 -
双链表操作详解
之前学习了单链表的相关操作,但是单链表有一个缺点,无法快速访问前驱结点,当查找到某个元素时,如果想要找到前面元素的结点,需要再次从头遍历,这样就比较麻烦,那么是否可以在节点中再增加一个指针指向前驱结点,答案是可以的。增加了指向前驱结点的指针的链表称为双链表链表分类 链表还有一种常用,那就是循环链表,顾名思义,这种链表就是头尾相连单链表 双链...原创 2019-04-24 19:53:14 · 246 阅读 · 0 评论 -
线性表之链表
为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。数据域:我们把存储数据元素信息的域称为数据域。 指针域:存储直接后继位置的域称为指针域。 指针/链:指针域中存储的信息称做指针或链。 结点(Node):数据域与指针域这两部分信息组成数据元素ai的存储映像,称为结点(N...原创 2019-04-23 14:17:52 · 232 阅读 · 0 评论 -
线性表之顺序表
线性表(List):零个或多个数据元素的有限序列1. 首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。2. 然后,线性表强调是有限的。事实上,在计算机中处理的对象都是有限的,那种无限的数列,只存在于数学的概念中。如果用数学语言来进行定义:若将线性表记为(a1, ……, ai-1, ai,...原创 2019-04-23 14:00:25 · 241 阅读 · 0 评论 -
无头单链表结点的删除、插入问题(不能遍历链表)
删除一个无头单链表的非尾节点(不能遍历链表)例如:无法获取1结点的位置,删除2结点void RemoveNoFirst(ListNode* pos){ pos->data = pos->next->data; ListNode* del = pos->next; pos->next = pos->next->next; ...原创 2019-04-25 21:20:26 · 839 阅读 · 0 评论