链表

LeetCode刻意练习10--两数相加

筅森魡賤 提交于 2020-03-08 15:05:52
题目: 思路: 要注意到是逆序存储,否则会将问题复杂化。 1.定义一个结点,用于存储结果单链表。其中定义一个指针ptr,方便该链表进行元素的添加。 2.考虑特殊情况,长度不相等,l1或l2为空。 (1)carry(进位)+不为空的值==0,则将0存入结果链表,并且carry=1; (2)carry+不为空的链表的值<0;j将该值直接存入结果链表。 不为空的链表指针前移,重复以上步骤,直到链表遍历结束 3.一般情况,长度相等。 (1)相同位置两个结点加上carry的和大于等于10,则将该值-10后存入结果链表,carry=1; (2)相同位置两个结点加上carry的和小于10,则将该值后存入结果链表。并且carry=0; 两链表指针后移,重复以上步骤,直到链表遍历结束。 注意:跳出循环后还要关注carry是否为1,如果是,则将1存入结果单链表。 ListNode result = new ListNode ( 0 ) ; ListNode ptr = result ; int carry = 0 ; while ( l1 != null && l2 != null ) { if ( l1 . val + l2 . val + carry >= 10 ) { ListNode p = new ListNode ( l1 . val + l2 . val + carry - 10 ) ;

堆”,\"栈\",\"堆栈\",\"队列\"以及它们的区别

烂漫一生 提交于 2020-03-08 14:32:10
如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到,所以如果你不懂对你是损失很大的。 堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值; ·堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 ④ 堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 栈:什么是栈?又该怎么理解呢? ①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出) ③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FILO(先进后出)的特性,在编译的时候可以指定需要的Stack的大小。 堆栈

数据结构——链表的习题

拟墨画扇 提交于 2020-03-08 13:27:33
题目 将若干城市的信息,存入一个单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。 [基本要求] (1) 能在单链表中插入、删除、更新城市信息; (2) 给定一个城市名,返回其位置坐标; (3) 给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 代码(C++) 借鉴网上的代码 C#没有链表的相关函数,需要自己编写,所以还是C++好用一些 插入函数写了简单的在最后插入,没有写在中间插入 # include <iostream> # include <math.h> # include <conio.h> # include <string> using namespace std ; struct Node //创建结点 { char Name [ 50 ] ; double x; double y ; Node * next ; } ; class List { private : Node * head , * f ;

hashmap学习笔记

♀尐吖头ヾ 提交于 2020-03-08 13:21:41
最近开始在阅读一些源码之类的学习,趁着周末,今天详细学习了一些HashMap底层的知识,遂记录下来。有很多理解或者描述不当之处,望请指正。 ## 一、数据底层结构图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190526213014826.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21pYW9wYXMx,size_16,color_FFFFFF,t_70) 首先放一张HashMap底层结构图,由于现在JDK几乎都用8及以上了,因此本文记录的都是基于JDK8的HashMap。 在JDK8以后,HashMap底层采用数组+链表+红黑树的形式来进行存储。 HashMap底层用一个数组来存放节点,节点在数组中的位置是由一个特殊的算法计算出来的(下文会提到)。如果两个节点计算出来的hash值相同,那么就将新的节点以链表的形式,连接在已存在的节点的后面。如果同一位置的节点数超过8个,那么会将链表改成红黑树的形式进行存储。 这样说有点抽象,结合源码一起看吧。 ## 二、HashMap源码解读 首先我们来看HashMap中的基本单位,节点,包括链表节点和红黑树节点。 链表节点: ``` /**

删除链表中的重复元素

那年仲夏 提交于 2020-03-08 11:43:07
判断下一个元素与前一个元素的关系,如果相等,就把第三个值赋给第二个值,如果不相等,就从第二个元素从新判断 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution : def deleteDuplicates ( self , head : ListNode ) - > ListNode : l = head if l == None or l . next == None : return head while l . next : if l . val == l . next . val : l . next = l . next . next else : l = l . next return head 来源: CSDN 作者: 李如花 链接: https://blog.csdn.net/lvjiwei001/article/details/104727692

《线性表的一些总结》

非 Y 不嫁゛ 提交于 2020-03-08 11:14:24
                        线性表 1,线性表可分为:顺序表和链表。 2,其中顺序表和链表有又静态顺序表,动态顺序表和静态链表,动态链表之分。 3,线性表的一般操作有: (1):线性表的创建,插入,删除等操作。 //顺序表的一些基本操作 #include<stdio.h> #define MaxSize 10 //向顺序表中插入元素 void InsertElem(int Sqlist[],int *len,int i,int x) {//向顺序表中第i个位置上插入元素x int t; if(*len==MaxSize || i<1 || i>*len+1) { printf("插入位置非法!"); return; } for(t = *len-1;t>=i-1;t--) Sqlist[t+1] = Sqlist[t]; Sqlist[i-1] = x; *len = *len+1; } //向顺序表中删除元素 void DelElem(int Sqlist[],int *len,int i) {//删除顺序表中第i个元素 int j; if(i<1 || i>*len) { printf("删除位置非法!"); return; } for(j=i;j<=*len-1;j++) Sqlist[j-1] = Sqlist[j]; *len = *len - 1;

HashMap,TreeMap,WeakHashMap,HashTable

自作多情 提交于 2020-03-08 11:10:02
1,HashMap hashmap数据结构为一个hash表,具体的代码实现就是一个数组,每个数据里面存放一个链表,初始化的时候默认的数组大小为16,负载因子为0.75(这个值可以保证碰撞最低并且空间利用率最高),当元素的个数大于(负载因子*数组长度)的时候,会进行数组扩容,扩大为2倍(所以当内存比较吃紧的时候,可以适当地增加负载因子,当内存很充足的时候,可以减少负载因子)。前面的叙述是针对jdk7及以下版本的,jdk8的hashmap稍稍做了一些改变,就是当数组中的链表达到一定的阈值的时候,这个链表会转化成一颗红黑树,这个优势就很明显了,在红黑树里面查询一个数据可比在链表中查询效率高多了。 2,TreeMap 可以说不论是添加操作,还是查找操作,treeMap的效率都没有hashMap高,因为在操作之前他们都是需要定位的,而hashMap只需要算出hash值就可以找到相应的数组小标,从而定位到相应的位置,而treemap是需要从树的顶端往下寻找,时间复杂度为log(n),那这个treemap的价值是什么呢?别忘了treemap实现了一个接口叫做SortedMap,也就说treemap是一个有序的map,当你需要按顺序输出一组数据的时候就可以选择treemap了。 treemap的内部数据结构是红黑树(R-B Tree)

JavaScript实现双向链表

99封情书 提交于 2020-03-08 10:55:30
JavaScript实现双向链表 一、双向链表简介 双向链表 :既可以 从头遍历到尾 ,又可以 从尾遍历到头 。也就是说链表连接的过程是 双向 的,它的实现原理是:一个节点既有 向前连接的引用 ,也有一个 向后连接的引用 。 双向链表的缺点: 每次在 插入或删除 某个节点时,都需要处理四个引用,而不是两个,实现起来会困难些; 相对于单向链表,所占 内存空间更大 一些; 但是,相对于双向链表的便利性而言,这些缺点微不足道。 双向链表的结构: 双向链表不仅有 head 指针指向第一个节点,而且有 tail 指针指向最后一个节点; 每一个节点由三部分组成: item 储存数据、 prev 指向前一个节点、 next 指向后一个节点; 双向链表的第一个节点的prev指向 null ; 双向链表的最后一个节点的next指向 null ; 双向链表常见的操作(方法): append(element):向链表尾部添加一个新的项; inset(position,element):向链表的特定位置插入一个新的项; get(element):获取对应位置的元素; indexOf(element):返回元素在链表中的索引,如果链表中没有元素就返回-1; update(position,element):修改某个位置的元素; removeAt(position):从链表的特定位置移除一项; isEmpty

链表数据结构

这一生的挚爱 提交于 2020-03-08 10:54:17
python实现 链表 的代码如下所示: #链表的创建和连接函数#链表是由数据域item和next连接关系class Node: def __init__(self,item): self.item=item self.next=Nonea=Node(1)b=Node(2)c=Node(3)a.next=bb.next=cprint(a.next.item)#头插法创建链表(倒序)def creat_linklist_head(li): head=Node(li[0]) for element in li[1:]: node=Node(element) node.next=head head=node return head#尾插法创建链表(顺序)def creat_linklist_tail(li): head=Node(li[0]) tail=head for element in li[1:]: node=Node(element) tail.next=node tail=node return head#打印链表的各个元素的函数def print_linklist(lk): while lk: print(lk.item,end=",") lk=lk.nextlk=creat_linklist_head([1,2,3])print_linklist(lk)lk=creat

206. 反转链表

☆樱花仙子☆ 提交于 2020-03-08 10:45:39
反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList(ListNode head) { ListNode root = null;; return Reverse(head, root); } public ListNode Reverse(ListNode head, ListNode returnNode) { if(head == null) return returnNode; ListNode next = head.next; head.next = returnNode; return Reverse(next, head); } }   今日一句:女神节快乐! 来源: https://www.cnblogs.com/Duancf/p/12441097.html