单链表

【leetcode】155. 最小栈( Min Stack )

别说谁变了你拦得住时间么 提交于 2020-01-21 17:52:36
题目描述 【leetcode】155. 最小栈( Min Stack ) 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小元素。 第一次解答 思路: 弄一个单链表,top永远指向单链表起始 添加元素在单链表头部添加 为了实现常量检索最小值,每个单链表元素额外附带一个元素min min存储了该元素添加后,此时stack内的最小值 class cMyLink { public : cMyLink * next ; int val ; int min_val ; cMyLink ( int x ) { next = nullptr ; val = x ; } private : cMyLink ( ) { } } ; class MinStack { public : cMyLink * p_top ; /** initialize your data structure here. */ MinStack ( ) { p_top = nullptr ; } void push ( int x ) { cMyLink * p_top_last = p_top ; p_top = new cMyLink ( x

C++实现单链表基本操作

↘锁芯ラ 提交于 2020-01-18 11:30:47
C++实现单链表基本操作 本博客按照上篇博客线性表单链表的基本操作而写出的完整代码,详情请看 单链表基础概念 # include <iostream> using namespace std ; //函数结果状态代码 # define OK 1 # define ERROR 0 typedef int Status ; // Status 相当于 int typedef char ElemType ; //ElemType 相当于 char typedef struct LNode { //类型定义 ElemType data ; struct LNode * next ; } LNode , * LinkList ; LinkList L ; //创建单链表L LNode * p , * q , * s , * r ; //或LinkList p,q; int j ; Status InitList ( LinkList & L ) ; //始化操作,建立一个空的线性表L Status DestroyList ( LinkList & L ) ; //销毁单链表L Status ClearList ( LinkList & L ) ; //清空单链表L int ListEmpty ( LinkList L ) ; //判断是否为空 int ListLength (

单链表的基本操作

只愿长相守 提交于 2020-01-18 03:13:55
1、创建 #include<iostream> using namespace std; struct node { int data; node* next; }; node* create(int array[],int n) { node* head=new node; head->next=NULL; //别忘记置空!! node* pre=head; node* p; for(int i=0;i<n;i++) { p=new node; p->data=array[i]; p->next=NULL; pre->next=p; pre=p; } return head; } int main() { int array[5]={1,2,3,4,5}; node* l=create(array,5); l=l->next; while(l!=NULL) { cout<<l->data<<" "; l=l->next; } return 0; } 2、插入 void insert(node* head,int pos,int x) { node* p=head; for(int i=0;i<pos-1;i++) { p=p->next; } node* q=new node; q->data=x; q->next=p->next; p->next=q; } 3、查找 int

萌新七叶的数据结构初学笔记——线性表

与世无争的帅哥 提交于 2020-01-17 01:02:32
目录 一 线性表 二 顺序表 1.静态分配 2.动态分配 1.使用typedef有什么用处 2.使用typeof有什么好处 3.为什么使用ElemType作为数据类型 3.顺序表的基本操作 1.初始化 2.创建 3.取值 4.查找 5.插入 6.删除 三 单链表 1.单链表的存储方式 2.单链表的基本操作 1.初始化 2.创建 3.取值 4.查找 5.插入 6.删除 四 双向链表 五 循环链表 六 线性表的应用 一 线性表 线性表是由n(n>=0)个相同类型的数据元素组成的有限序列,它是最基本、最常用的一种线性结构。顾名思义,线性表就像一条线,不会分叉。线性表有唯一的开始和结束,除了第一个元素外,每个元素都有唯一的直接前驱:除了最后一个元素外,每个元素都有唯一的直接后继。 线性表有两种存储方式:顺序存储和链式存储。采用顺序存储的线性表称为顺序表,采用链式存储的线性表称为链表。链表又分为单链表、双向链表和循环链表。 二 顺序表 顺序表采用顺序存储方式,即逻辑上相邻的数据在计算机内的存储位置也是相邻的。顺序存储方式,元素存储是连续的,中间不允许有空,可以快速定位第几个元素,但是插入和删除时需要移动大量元素。根据分配空间方法不同,顺序表可以静态分配和动态分配两种方法。 1.静态分配 顺序表最简单的方法是使用一个定长数组data[ ]存储数据,最大空间为Maxsize

哈希表相关

早过忘川 提交于 2020-01-13 00:20:16
由于哈希表的查找高效性,在平时的算法中用的也比较多。例如:字符串、单词个数统计、只出现一次字符或者数字的统计,两个集合相同元素的查找等等,还有插入删除的高效(链地址法)都可以用哈希表来解决。所以这里对其做一个小小的总结。缺点是可能需要占用额外的内存空间。 一、哈希函数的构造方法 下面介绍五种常用的哈希构造方法: 构造哈希函数的原则是: (1)函数本身便于计算; (2)计算出来的地址分布均匀,即对任一关键字k,f(k)对应不同地址的概率相等,目的是尽可能减少冲突。 1、除留余数法 取关键字被某个不大于哈希表长m的数p除后所得的余数为哈希地址。即: H(key)=key MODE p,p<=m(p的取值最好为素数)。 若冲突较多,可取较大的m和p值。 2、随机法 采用一个伪随机函数做哈希函数,即: H(key)= random(key)。其中random为随机函数。 通常,当关键字长度不等时采用此构造哈希函数比较恰当。 3、平方取中法 当无法确定关键字中那几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。 这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。 例如对于关键key:123。123^2=1522756,H(K)关键字的哈希地址为:227 4、折叠法

DS单链表--类实现

夙愿已清 提交于 2020-01-10 20:31:02
题目描述 用C++语言和类实现单链表,含头结点 属性包括:data数据域、next指针域 操作包括:插入、删除、查找 注意:单链表不是数组,所以位置从1开始对应首结点,头结点不放数据 类定义参考 输入 n第1行先输入n表示有n个数据,接着输入n个数据 第2行输入要插入的位置和新数据 第3行输入要插入的位置和新数据 第4行输入要删除的位置 第5行输入要删除的位置 第6行输入要查找的位置 第7行输入要查找的位置 输出 n 数据之间用空格隔开, 第1行输出创建后的单链表的数据 每成功执行一次操作(插入或删除),输出执行后的单链表数据 每成功执行一次查找,输出查找到的数据 如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出单链表 样例输入 6 11 22 33 44 55 66 3 777 1 888 1 11 0 5 样例输出 11 22 33 44 55 66 11 22 777 33 44 55 66 888 11 22 777 33 44 55 66 11 22 777 33 44 55 66 error error 44 提示 #include<iostream> using namespace std; #define ok 0 #define error -1 class CNode { int data; CNode *next; public:

第十二周作业

自作多情 提交于 2020-01-10 06:29:08
这次作业属于哪个课程 C语言程序设计 这次作业要求在哪里 第十二周作业 我在这个课程的目标是 二级指针及指针数组 这个作业具体在那个方面帮助我实现目标 还是寸头好 参考文献 C语言程序设计 第十二周作业 基础题 计算最长的字符串长度 本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。 函数接口定义: int max_len( char *s[], int n ); 其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。 裁判测试程序样例: #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 10 #define MAXS 20 int max_len( char *s[], int n ); int main() { int i, n; char *string[MAXN] = {NULL}; scanf("%d", &n); for(i = 0; i < n; i++) { string[i] = (char *)malloc(sizeof(char)*MAXS); scanf("%s", string[i]); } printf("%d\n", max_len(string, n)); return 0; } /* 你的代码将被嵌在这里 */

[算法][LeetCode]Linked List Cycle & Linked List Cycle II——单链表中的环

不想你离开。 提交于 2020-01-02 01:12:26
题目要求 Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 如何判断一个单链表中有环? Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cycle, return null . Follow up: Can you solve it without using extra space? 如何找到环的第一个节点? 分析 一开始使用了复杂度O(n^2)的方法,使用两个指针a, b。a从表头开始一步一步往前走,遇到null则说明没有环,返回false;a每走一步,b从头开始走,如果遇到b==a.next,则说明有环true,如果遇到b==a,则说明暂时没有环,继续循环。 后来找到了复杂度O(n)的方法,使用两个指针slow,fast。两个指针都从表头开始走,slow每次走一步,fast每次走两步,如果fast遇到null,则说明没有环,返回false;如果slow==fast,说明有环,并且此时fast超了slow一圈,返回true。

关于快慢指针的若干应用详解

∥☆過路亽.° 提交于 2019-12-30 22:37:31
一.问题来源   昨晚看微博,发现于梁斌penny,他在说现在的面试制度考不出来真功夫,也就是基本功,面试题千篇一律的算法,看过会,不看就不会。期间提到了快慢指针求中位数。   查资料时我发现,这其实是计算机系统原理里的知识点。 二.快慢指针概念   快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。 三.快慢指针的应用 3.1 判断单链表是否为循环链表   对于初学者来说,要解决这个问题,最可能采取的方法就是使用两个循环。当外层循环步进一个节点时,内层循环就遍历外层循环节点之后的所有节点,然后比较内外循环的两个节点。若有节点地址相等,则表明该单链表有循环,反之则不存在循环。这种方法无疑效率比较低。   今天给大家介绍一个经典的方法,通过快慢指针来检查单链表是否存在循环。其思路很简单,大家可以想一下上体育课长跑的情景。当同学们绕着操场跑步的时候,速度快的同学会遥遥领先,最后甚至会超越其它同学一圈乃至n圈——这是绕圈跑。那么如果不是绕圈跑呢?速度快的同学则会一直领先直到终点,不会再次碰到后面的速度慢同学——不考虑地球是圆的这种情况。   快慢指针的设计思想也是这样。快指针每次步进多个节点——这个视情况而定,慢指针每次只步进一个节点。那么如果该链表存在循环的话,快指针一定会再次碰到慢指针,反之则不存在循环。

单链表结点删除

巧了我就是萌 提交于 2019-12-29 21:37:38
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。 函数deletem将单链表L中所有存储了m的结点删除。返回指向结果链表头结点的指针。 # include <stdio.h> # include <stdlib.h> struct ListNode { int data ; struct ListNode * next ; } ; struct ListNode * readlist ( ) ; struct ListNode * deletem ( struct ListNode * L , int m ) ; void printlist ( struct ListNode * L ) { struct ListNode * p = L ; while ( p ) { printf ( "%d " , p -> data ) ; p = p -> next ; } printf ( "\n" ) ; } int main ( ) { int m ; struct ListNode * L = readlist ( ) ; scanf ( "%d" , & m ) ; L = deletem ( L , m