链表

牛客网--链表分割

和自甴很熟 提交于 2020-03-11 03:19:20
题目描述 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。 思路: 1.我们可以定义两个链表(结构体类型变量)(比如small,large),分别放小于x的结点、大于或等于x的结点。 2.对原链表进行遍历,与x进行比较大小,对两个新链表进行尾插(所以还要分别定义两个指针哦) 3.遍历完后,结点位置都已经放好了,我们再把两个链表连起来就可以了 注 : 这里要用到 . 操作符,它是结构体类型变量访问内部成员的;而 -> 是通过指针访问结构体内部的变量 struct ListNode { int val ; struct ListNode *next ; ListNode ( int x ) : val ( x ) , next ( NULL ) { } } ; class Partition { public : ListNode * partition ( ListNode * pHead , int x ) { //先给两个链表,定义结构体类型的变量 ListNode small ( 0 ) ; ListNode large ( 0 ) ; //给两个链表分别定义指针(进行尾插) ListNode *

数据结构之单链表

放肆的年华 提交于 2020-03-11 02:22:50
顺序表之链接表示 概念:链接表示是实现线性表的另一种经常使用的存储结构。这种存储结构 不要求 逻辑关系上相邻的两个元素在 物理位置上也相邻存储 ,而是通过增加指针来表示元素之间的逻辑关系和后继元素的位置。 1. 单链表表示 单链表中的每个结点包括两个域:数据域(info)——存放元素本身的信息; 指针域(link)——存放后续结点的存储位置。 最后一个元素没有后继,它的指针不指向任何结点,成为空指针。^ NULL 每个结点只有一个指针域的链表叫单链表,指向链表中第一个结点的指针称为该链表的头指针。 做以下定义: struct Node ; //单链表的结点类型; typedef struct Node * PNode ; //指向结点的指针类型; struct Node { //单链表结点结构 DataType info ; PNode link ; } ; typedef struct Node * LinkList 假设llist是某单链表的头指针 加一个头结点会使得对单链表中的第一个结点进行处理时方便很多,具体内容下面会有提及。 2.单链表上运算的实现 1.创建空链表 LinkList createNullList_link ( void ) { LinkList llist = ( LinkList ) malloc ( sizeof ( struct Node ) ) ;

数据结构与算法_1.稀疏数组和队列_2

孤街醉人 提交于 2020-03-11 01:54:18
1.2 队列 单链表 链表为有序列表,在内存中的存储如下: 链表是以节点的方式来存储,是链式存储。 每个节点包含:data 域和 next 域(指向下一个节点)。 链表的各个节点不一定是连续存储的。 链表分有头节点的链表和没有头节点的链表,根据实际的需求来确定。 代码实现 : /* 1. 第一种方法:添加节点时,直接添加到链表尾部 */ public class Demo01SingleLinkedList { public static void main ( String [ ] args ) { // 创建节点 HeroNode hero1 = new HeroNode ( 1 , "宋江" , "及时雨" ) ; HeroNode hero2 = new HeroNode ( 2 , "卢俊义" , "玉麒麟" ) ; HeroNode hero3 = new HeroNode ( 3 , "吴用" , "智多星" ) ; HeroNode hero4 = new HeroNode ( 4 , "林冲" , "豹子头" ) ; // 创建链表 SingleLinkedList singleLinkedList = new SingleLinkedList ( ) ; // 加入节点 singleLinkedList . add ( hero1 ) ;

数据结构

自闭症网瘾萝莉.ら 提交于 2020-03-10 22:16:20
数据结构学习 数据结构简介 线性结构 树 图 散列查找 排序 数据结构简介 维基百科:数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最有效率的算法。 数据结构:涵盖(1)数据对象(2)其组织方式[逻辑存储、物理存储](3)操作集(4)实现操作的最高效算法 解决问题的效率与数据的组织方式有关,跟空间利用效率有关,也与算法的巧妙程度有关。 “数据结构”包括数据对象集以及它们在计算机中的组织方式,即它们的逻辑结构和物理存储结构,同时还包括与数据对象集相关联的操作集,以及实现这些操作的最高效的算法。抽象数据类型是用来描述数据结构的重要工具。 “算法”是解决问题步骤的有限集合,通常用某一种计算机语言进行伪码描述。我们用时间复杂度和空间复杂度来衡量算法的优劣,用渐进表示法分析算法复杂度的增长趋势。 线性结构 数据的组织方式:(1)逻辑结构:线性、树、图 (2)物理存储结构:数组、链表 线性表 :是由同一类型的数据元素构成的有序序列的线性结构 线性表:顺序存储实现;链式存储实现 广义表:是线性表的推广,元素不仅可以是单元素也可以是另一个广义表;多重链表:存在结点属于多个链的链表,指针域会有多个(双向链表不是多重链表)。 堆栈 :具有一定约束的线性表,插入和删除操作都作用在一个称为栈顶的端点位置。 队列 :具有一定操作约束的线性表,只能在一端插入,而在另一端删除。

JDk1.8HashMap的源码分析

久未见 提交于 2020-03-10 20:27:38
JDk1.8HashMap的源码分析 HashMap用数组存放数据(总结) 调用键的hashCode()获得键的哈希值 用哈希值,计算一个下标值 i 新建Entry对象来封装键和值 Entry对象放在 i 位置 空位置,直接放入 有数据,依次用equals()比较是否相等 找到相等的,覆盖值 没有相等的,链表连接在一起 负载率、加载因子到0.75 新建翻倍容量的新数组 所有数据,重新哈希,放入新数组 jdk1.8 链表长度到8,转成红黑树 红黑树数据量减少到6,转回成链表 hashCode() Object的方法 Object中默认实现是使用内存地址,作为哈希值 如果对象作为键,放入HashMap,应该重写hashCode(),使用属性数据,来计算哈希值 HashMap中根据hash值求得index的 // 先用key求得hash值 static final int hash ( Object key ) { // h = key.hashCode() 为第一步 取hashCode值 // h ^ (h >>> 16) 为第二步 高位参与运算 int h ; return ( key == null ) ? 0 : ( h = key . hashCode ( ) ) ^ ( h >>> 16 ) ; } JDK1.8HashMap的put方法源码如下 /** * (1)

习题11-7 奇数值结点链表 (20分)

♀尐吖头ヾ 提交于 2020-03-10 19:34:07
struct ListNode * readlist ( ) { //本题是不带头节点的,但是我用的带头结点的方法,所以最后我返回了H->next; struct ListNode * H = ( struct ListNode * ) malloc ( sizeof ( struct ListNode ) ) ; H -> data = 0 ; struct ListNode * s = H ; int in ; scanf ( "%d" , & in ) ; while ( in != - 1 ) { struct ListNode * p = ( struct ListNode * ) malloc ( sizeof ( struct ListNode ) ) ; p -> data = in ; s -> next = p ; s = p ; scanf ( "%d" , & in ) ; } return H -> next ; } struct ListNode * getodd ( struct ListNode * * L ) { //由于我适应了使用带头结点的链表,所以最后返回H->next就是一样的 struct ListNode * H1 = ( struct ListNode * ) malloc ( sizeof ( struct ListNode ) )

链表的操作(未完待续)

半腔热情 提交于 2020-03-10 18:05:31
#include<iostream> using namespace std; typedef struct LNode { int data; struct LNode *next; }LNode , *LinkList; LNode *p,*q; LinkList H; //求链表的长度 int ListLength(LinkList L) { p = L; int k = 0; while(p){ k++; p = p->next; } return k; } // 查找元素操作 LNode *Locate(LinkList L,int e) //e's type is int { //在L所指链表中查找第一个值和e相等的元素,若存在,则返回 //它在链表中的位置,即指向该数据的元素所在节点的指针,否则返回NULL p = L; //用指针的方法代替下标,需要用一个节点类型的指针替换一下,以便操作 while(p && p->data != e) p = p->next; return p; } //插入节点操作(前插) void Insert (LinkList &L,LNode *p,LNode *s) { //指针p指向L为头节点的链表中某个节点,将s节点插入到p节点之前 if (p == L){ s->next = L; L = s; } else { q = L;

缓存算法(页面置换算法)-FIFO、LFU、LRU

天大地大妈咪最大 提交于 2020-03-10 16:38:39
转自:http://www.cnblogs.com/dolphin0520/ 1.FIFO算法   FIFO(First in First out),先进先出。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?因为这个原则简单、且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中的队列即可实现。   在FIFO Cache设计中,核心原则就是: 如果一个数据最先进入缓存中,则应该最早淘汰掉 。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。在FIFO Cache中应该支持以下操作;    get(key):如果Cache中存在该key,则返回对应的value值,否则,返回-1;   set(key,value):如果Cache中存在该key,则重置value值;如果不存在该key,则将该key插入到到Cache中,若Cache已满,则淘汰最早进入Cache的数据。    举个例子:假如Cache大小为3,访问数据序列为set(1,1),set(2,2),set(3,3),set(4,4),get(2),set(5,5)   则Cache中的数据变化为:   (1,1) set(1,1)   (1,1) (2,2) set(2,2)   (1,1) (2,2) (3,3) set

打开一个文件操作系统做了什么?

情到浓时终转凉″ 提交于 2020-03-10 15:28:00
当我们打开一个文件时,主要涉及了进程,文件描述符,文件描述表,打开文件表,目录项,索引表之间的联系。 今天主要围绕这几个图来说 第一进程控制块PCB与文件描述符的关系 在进程控制块维护一个指向files-structure的结构体(可以看作是一个指向file结构体的指针数组 *file[n]),而所谓的文件描述符就是这个表的索引(就是数组的下标),表中存储的是一个指针(数组的类型),指向files结构体。 file结构体—文件控制块 struct file { union { struct llist_node fu_llist; struct rcu_head fu_rcuhead; } f_u; struct path f_path; #define f_dentry f_path.dentry struct inode *f_inode; /* cached value */ const struct file_operations *f_op; /* * Protects f_ep_links, f_flags. * Must not be taken from IRQ context. */ spinlock_t f_lock; atomic_long_t f_count; unsigned int f_flags; fmode_t f_mode; struct

HashMap源码分析(jdk12)

房东的猫 提交于 2020-03-10 15:06:41
1. 初始化 ,hashMap初始化容量默认大小为16,默认负载因子为0.75F 一共有3个构造器 无参 带初始化容量 带初始化容量和初始化加载因子 前两个构造器都是调用第三个构造器。如果没有设置初始化容量或负载因子,以默认值创建。值得一提的是: 在调用构造器创建HashMap时不会立即创建容器,(在jdk1.8之后为 Node<K,V>[] table 用于存储键值对)。而是会在你第一次put元素的时候调用resize方法创建。 容器的大小必须为2的倍数。你在设置初始化容器大小时,如果输入的不是2的倍数,那会自动调整为最接近的大于输入值的2的倍数。主要在tableSizeFor这个方法实现。 该方法,先获取 输入数-1 的32位二进制前导零数目(这里-1理解一下就好了,不-1那对于恰好是2的倍数的,会扩大一倍)。-1无符号右移前导零数目位,这样就得到了最接近 输入数 的 2的倍数-1。最后判断n的大小, 如果n=-1表示cap=1,那就设置容量为1; 如果n>0,如果大于最大容量,那就设置为最大容量,否则设置为n+1。 hashMap有最大容量。2^30 链表长度阈值 当长度大于8时,会从链表转化为红黑树。至于为什么设置为8主要是理想状态下,设置合理的HashMap,根据泊松分布计算得到链表长度达到8的概率极低( 0.00000006)