单向链表

线性表之链表实现:单向链表、循环链表、双向链表

余生长醉 提交于 2019-12-22 05:34:31
线性表 单向链表实现: 优点:便于插入和删除 缺点:查找数据需要遍历 声明 一个数据+一个指针 typedef struct LNode *List; struct LNode { int Data; List next; }; 求表长 遍历表,当指向节点的指针为NULL时停止 int Length(List PtrL) { List p = PtrL; int j = 0; while (p) { p = p->next; j++; } return j; } 查找数据 当指针不为NULL或者未找到数据时,继续循环 按值查找 List Find(int X, List PtrL) { List p = PtrL; while (p!=NULL && p->Data != X)p = p->next; return p; } 按序号查找 List FindKth(int K, List PtrL) { List p = PtrL; int i = 1; while (p != NULL&&i < K) { p = p->next; i++; } if (i == K)return p; else return NULL; } 插入数据 当插在第一个位置时:创建节点,让该节点直接指向头结点。 当插在第i个位置时:创建节点,让该节点指向该位置的后一个节点

单向链表JAVA代码

送分小仙女□ 提交于 2019-12-20 10:52:16
//单向链表类 public class LinkList { //结点类 public class Node { public Object data ; public Node next ; public Node ( Object obj , Node next ) { this . data = obj ; this . next = next ; } } Node head ; //记录头结点信息即可(头结点下标为-1) int size ; public LinkList () { this . head = new Node ( null , null ); this . size = 0 ; } //定位 public Node locate ( int index ) throws Exception { //容错性 if ( index < - 1 || index > size ) throw new Exception ( "参数错误!" ); //定位到temp指向第index个(index为下标,从0开始) Node temp = head ; for ( int i = - 1 ; i < index ; i ++) if ( temp != null ) temp = temp . next ; return temp ; } public void

链表,栈,队列插入删除操作

ぐ巨炮叔叔 提交于 2019-12-17 18:37:32
本文主要对常见的几种数据结构的插入删除操作进行整理和说明,具体的可视化程序可参考 这里 。 1、链表 1.1 单向链表 插入结点:在 指针p所指的 结点 后 插入指针s所指的结点。 (1)s->next = p->next; (2)p->next = s 删除节点:删除指针p所指的结点的后继节点。 p->next = p->next->next 具体问题可以参考《编程之美》中的 从无头单链表中删除节点 问题。 1.2 双链式链表 插入结点: 指针p所指的 结点 前 插入指针s所指的结点。 (1) s->prior = p->prior; (2) p-> prior ->next = s; (3) s->next = p; (4) p->prior = s 删除节点:删除指针p所指的结点 (1)p->next->proir =p->prior; (2)p->prior->next =p->next 2、栈 2.1 顺序栈 2.1.1 栈顶指针与栈中元素关系如下: 2.1.2 栈的数据结构 并做如下规定: 1. top=base 表示栈空 (int top :top=0 ) 2. top - base>= stacksize 表示栈满;( top == stacksize ) 3. 栈顶元素表示:*(top-1) (base[top-1] ) 2.1.3 基本操作 构建空栈:

HashMap、ConcurrentHashMap解析

女生的网名这么多〃 提交于 2019-12-04 01:44:28
一、HashMap分析   在JDK1.8之前,hashMap由数组+链表组成,1.8之后,对hashMap进行了一些修改,最大的不同就是利用了红黑树,所以其由数组+链表+红黑树组成。查找时,根据hash值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度为O(n),为了降低这部分的开销,在Java8中,当链表中的元素达到了8个时,会将链表转换为红黑树,在这些位置进行查找时可以降低时间复杂度为O(logn)。 1.put过程:(JDK1.8)    第一次put值时,会触发resize(),类似Java7的第一次put也是要初始化数组长度的。    第一次resize和后续的扩容有些不一样,因为这次是数组从null初始化到默认的16或自定义的初始容量,找到具体的数据下标,如果此位置没有值,那么直接初始化一下Node并放置在这个位置就可以了。如果数组改为只有数据:首先,判断该位置的第一个数据和我们要插入的数据,key是不是“相等”,如果是,取出这个节点,如果该节点是代表红黑树的节点,调用红黑树的插值方法,插入到链表的最后面(Java7是插入到链表的最前面),当treeify_threshold为8时,如果新插入的值是链表中的第8个,会触发下面的treeifyBin,也就是将链表转换为红黑树;如果在该链表中找到了

输出链表环路入口节点

≡放荡痞女 提交于 2019-12-03 05:33:28
1 package offer; 2 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 7 import Struct.ListNode; 8 9 /** 10 * 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 11 * @author 爱不会绝迹 12 * 13 */ 14 public class Problem32 { 15 /** 16 * 我的解法,利用map标记每一个节点的出现的次数,第一个为出现次数为2的节点就是入口节点 17 * @param pHead 18 * @return 19 */ 20 public static ListNode EntryNodeOfLoop(ListNode pHead) 21 { 22 Map<ListNode,Integer> map = new HashMap<>(); 23 ListNode p = pHead; 24 while(p!=null){ 25 if(map.get(p)==null){ 26 map.put(p, 1); 27 }else{ 28 return p; 29 } 30 p = p.next; 31 } 32 return null; 33 } 34 35 /**

数据结构――一些概念

匿名 (未验证) 提交于 2019-12-03 00:39:02
数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系 图状结构或网状结构 结构中的数据元素之间存在多对多的关系 物理结构/存储结构:数据在计算机中的表示。物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等 在数据结构中,从逻辑上可以将其分为线性结构和非线性结构 数据结构的基本操作的设置的最重要的准则是, 实现应用程序与存储结构的独立 。实现应用程序是“逻辑结构”,存储的是“物理结构”。逻辑结构主要是对该结构操作的设定,物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、希哈结构)等。 顺序存储结构中,线性表的逻辑顺序和物理顺序总是一致的。但在链式存储结构中

单向链表

匿名 (未验证) 提交于 2019-12-02 23:52:01
链表节点(其中info 表示节点信息,next是下一个节点引用,其中info可以通过template<class T> 实现泛型链表) #pragma once class IntSSLNode { public: IntSSLNode() { next = 0; info = 0; } IntSSLNode(int info, IntSSLNode* in = 0) { this->info = info; next = in; } int info; IntSSLNode* next; }; 链表类 #pragma once #include "IntSSLNode.h" class IntSSList { public: IntSSList() { head = tail = 0; } ~IntSSList(); int isEmpty() { return head == 0; } void addToHead(int); void addTotail(int); int deleteFromHead(); int deleteFromTail(); void deleteNode(int); bool isInList(int) const; private: IntSSLNode* head, * tail; }; #include<iostream> #include

Netty源码―五、内存分配概述

匿名 (未验证) 提交于 2019-12-02 22:56:40
Netty中的内存管理应该是借鉴了FreeBSD内存管理的思想―― jemalloc 。Netty内存分配过程中总体遵循以下规则: 优先从缓存中分配 如果缓存中没有的话,从内存池看看有没有剩余可用的 如果已申请的没有的话,再真正申请内存 分段管理,每个内存大小范围使用不同的分配策略 我们先总体上看下Netty内存分配的策略,然后再结合对应的数据结构来看看每种策略的具体实现。 netty根据需要分配内存的大小使用不同的分配策略,主要分为以下几种情况(pageSize默认是8K, chunkSize默认是16m): tiny: allocateSize<512,allocateSubpage small: pageSize>=allocateSize >=512,allocateSubpage normal: chunkSize >= allocateSize > pageSize ,allocateRun huge: allocateSize > chunkSize 内存分配的调用堆栈 结合上面内存分配的调用堆栈看看内存分配的主要过程: new一个ByteBuf,如果是direct则new:PooledUnsafeDirectByteBuf 从缓存中查找,没有可用的缓存进行下一步 从内存池中查找可用的内存,查找的方式如上所述(tiny、small、normal)

单向链表

*爱你&永不变心* 提交于 2019-12-02 06:45:07
1 #include<iostream> 2 #include<malloc.h> 3 using namespace std; 4 #define OK 1 5 #define ERROR 0 6 #define NULL 0 using namespace std;如果没有这行代码,c++语言的输入输出分别是:std::cin>>和std::cout<<,所以这行语句就是起到简化代码的作用。 1 typedef struct lnode{ 2 int data; 3 struct lnode *next;//结构体的嵌套,(在结构体内部声明了一个指针类型的结构体)即:指向下一个结构体 4 }lnode,*linklist; 建立结构体:   typedef struct 的作用: https://www.cnblogs.com/qyaizs/articles/2039101.html 1 void mergelist (linklist &la,linklist &lb,linklist &lc){ 2 lnode *pa; 3 lnode *pb; 4 lnode *pc; 5 pa = la->next; 6 pb = lb->next; 7 pc = lc = la; 8 while(pa && pb) 9 { 10 if(pb->data >= pa->data){

Python实现单向链表

Deadly 提交于 2019-11-30 16:03:22
单向链表 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。 链表的特点 1 单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小 2 结点的删除非常方便,不需要像线性结构那样移动剩下的数据 3 结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表 实现链表 能实现链表的语言有很多,这里我们使用Python语言来实现,不多说了,直接上代码: [Python] 纯文本查看 复制代码 ? 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060