链表

Java——链表的增删查改

…衆ロ難τιáo~ 提交于 2020-03-16 15:39:25
【基础学习】 链表的增删查改 注意:所有链表都先需要判断是否为null <1>链表的增 有三种方法,分别为:头插法,尾插法,任意节点位置插法 1.头插法 2.尾插法 3.任意节点位置插法 <2>链表的删除 1.删除第一个出现的data值,有两种方法(直接找到节点删除和虚拟头节点删除) 2.删除所有出现的data值,有两种方法(直接找到节点删除和虚拟头节点删除) <3>链表的查找 1.查询链表是否有指定节点 2.根据传入的index,来获取节点位置 <4>修改指定index当中的data值 .根据传入的index,来修改节点的data值 来源: CSDN 作者: 小迪耶 链接: https://blog.csdn.net/wkh18891843165/article/details/104843146

Java 容器源码分析之 LinkedList

时间秒杀一切 提交于 2020-03-16 08:16:09
概览 同 ArrayList 一样,LinkedList 也是对 List 接口的一种具体实现。不同的是,ArrayList 是基于数组来实现的,而 LinkedList 是基于双向链表实现的。LinkedList 类的声明如下: 123 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable LinkedList 继承自 AbstractSequentialList,实现了 List 接口,同时还实现了 Deque 接口。AbstractSequentialList 是 AbstractList 的子类,为基于顺序访问的链表提供了一些基本的实现。LinkedList 实现了 Deque 接口,Deque 接口是一种双端队列,可以作为 FIFO 队列和 LIFO 队列(栈)来使用。LinkedList 支持所有元素,包括 null。 下面基于JDK 8 中的代码对LinkedList的实现加以分析。 底层结构 LinkedList 基于双向链表进行实现,并使用两个引用 first 和 last 分别指向双向链表的头尾元素。同 ArrayList 一样,使用 modCount

基于双向链表的增删改查和排序(C++实现)

牧云@^-^@ 提交于 2020-03-16 07:57:51
基于双向链表的增删改查和排序(C++实现) 双向链表也叫 双链表 ,是链表的一种,它的每个数据结点中都有两个 指针 ,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向 循环链表 。 由于双向链表可以方便地实现正序和逆序两个方向的插入、查找等功能,在很多算法中经常被使用, 这里用C++构造了一个双向链表,提供了对双向链表的插入、查找、删除节点、排序等功能,其中排序提供了插入排序和冒泡排序两种方式 #include<iostream> using namespace std; class Node //组成双向链表的节点 { public: int data; Node * pNext; Node * pLast; }; class List //构造一个双向链表 { private: Node * pHead; Node * pTail; int length; public: List(int length)//创建双向链表 { this->length = length; pHead = new Node(); pHead->pLast = NULL; pTail = pHead; for (int i = 0; i < length; i++) { Node * temp = new Node();

HashMap实现原理分析

三世轮回 提交于 2020-03-16 04:07:43
1 HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找 时间复杂度小,为O(1); 数组的特点是: 寻址容易,插入和删除困难; 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。 链表 的特点是: 寻址困难,插入和删除容易。 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表( (Hash table ) 既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。 从上图我们可以发现哈希表是由 数组+链表 组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。   HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线性数组。这可能让我们很不解,一个线性的数组怎么实现按键值对来存取数据呢

48. 复杂链表的复刻

末鹿安然 提交于 2020-03-16 02:58:00
链表 AcWing 34. 链表中环的入口结点 66. 两个链表的第一个公共结点 17.从尾到头打印链表 29. 删除链表中重复的节点 ListNode* dummy = new ListNode(-1); dummy->next = pHead; ListNode* p = dummy; 33. 链表中倒数第k个节点 35. 反转链表 36. 合并两个排序的链表 ListNode *dummy = new ListNode(0); ListNode *cur = dummy; 48. 复杂链表的复刻 来源: https://www.cnblogs.com/make-big-money/p/12501495.html

21. 合并两个有序链表

╄→尐↘猪︶ㄣ 提交于 2020-03-15 19:30:06
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 //思路很清晰,建立一个虚拟节点 10 class Solution 11 { 12 public: 13 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) 14 { 15 ListNode* dummy = new ListNode(-1); 16 ListNode* head = dummy; 17 while(l1 && l2) 18 { 19 if(l1->val < l2->val) 20 { 21 head->next = l1; 22 l1 = l1->next; 23 } 24 else 25 { 26 head->next = l2; 27 l2 = l2->next; 28 } 29 head = head->next; 30 } 31 head->next = l1 ? l1 : l2; 32 return dummy->next; 33 } 34 }; 来源: https://www

Map-HashMap

[亡魂溺海] 提交于 2020-03-15 18:03:04
一、HashMap数据结构   JDK 1.7 采用数组 + 链表实现。   JDK 1.8 采用数组 + 链表 + 红黑树实现。链表采用内部类Node节点实现。红黑树采用内部类TreeNode节点实现。 二、重要参数  // 1. 容量(capacity): 必须是2的幂 & <最大容量(2的30次方),默认是16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;  // 最大容量 = 2的30次方(若传入的容量过大,将被最大值替换) static final int MAXIMUM_CAPACITY = 1 << 30; // 2. 加载因子(Load factor):HashMap在其容量自动增加前可达到多满的一种尺度 // 加载因子过大则容器内可添加更多元素,空间效率高,但是容易导致哈希冲突。反之反之 final float loadFactor; // 实际加载因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; // 默认加载因子 = 0.75 h // 3. 扩容阈值 = 容量 x 加载因子,哈希表的大小 ≥ 扩容阈值时,就会扩容哈希表 int threshold; // 4. 其他 transient Node<K,V>[] table; //

C#数据结构-链表

◇◆丶佛笑我妖孽 提交于 2020-03-15 05:29:24
理论基础: 链表是用一组任意的存储单元来存储线性表中的数据元素。 如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List)。 单链表由头引用H唯一确定。头引用指向单链表的第一个结点,也就是把单链表第一个结点的地址放在H中。 C#实现: 1接口 引用线性表的接口IListDS<T> 2实现 首先,必须定义一个单链表的节点类 public class Node<T> { private T data; //数据域 private Node<T> next; //引用域 public Node(T val) { data = val; next = null; } public Node() { data = default(T); next = null; } public T Data { get { return data; } set { data = value; } } public Node<T> Next { get { return next; } set { next = value; } } } 实现主体类 Append,Insert,InsertBack三个方法实质上都是插入操作,可以考虑用overload或者override来实现,有兴趣的朋友试试。 public class LinkList<T> :

C/C++ 知识点---链表操作

感情迁移 提交于 2020-03-15 05:23:52
1.单链表 单链表的结点类型node定义: typedef struct linknode { int data; struct linknode *node; }node; <1>.建立单链表 void CreateSingleLink() { node *head, *p, *s; int tempValue; bool bCycle = true; //bCycle循环控制变量 head = (node *)malloc(sizeof(node)); //建立头结点 p = head; while (bCycle) { scanf("%d", &tempValue); if (0 != tempValue) //以0标志结束 { s = (node *)malloc(sizeof(node)); //建立下一个结点 s->data = tempValue; p->next = s; //把新结点连接到前面建立的链表中 p = s; } else { bCycle = false; } } p->next = NULL; //如果是循环链表,则改为p->next = head; p = head; head = head->next; free(p); //删除头结点 } <2>.单链表查找结点 bool FindNode(node *head, int iValue) {

Arrays.asList的用法

我与影子孤独终老i 提交于 2020-03-15 02:29:29
16. 3Sum Closest 这道题让我们求最接近给定值的三数之和,是在之前那道 3Sum 三数之和 的基础上又增加了些许难度,那么这道题让我们返回这个最接近于给定值的值,即我们要保证当前三数和跟给定值之间的差的绝对值最小,所以我们需要定义一个变量result用来记录当前最小三个数的和,然后我们还是要先将数组排个序,然后开始遍历数组,思路跟那道三数之和很相似,都是先确定一个数,然后用两个指针left和right来滑动寻找另外两个数,每确定两个数,我们求出此三数之和sum,然后算和给定值的差的绝对值abs(sum-target),然后和abs(result-target)比较并更新结果result即可,代码如下: public class Solution { public int threeSumClosest(int[] num, int target) { int result = num[0] + num[1] + num[num.length - 1];//初始化 Arrays.sort(num); //选择一个数 for (int i = 0; i < num.length - 2; i++) { int start = i + 1, end = num.length - 1;//双指针指向最小数和最大数 while (start < end) { int sum =