链表

Map and HashMap

浪尽此生 提交于 2020-02-25 23:44:12
1.1.1. Map 接口 java提供了一组可以以键值对(key-value)的形式存储数据的数据结构,这种数据结构称为Map。我们可以把Map看成一个多行两列的表格,其中第一列存放key,第二列存放value。 而每一行就相当于一组key-value对,表示一组数据。 Map对存入的元素有一个要求,就是key不能重复,所谓不能重复指的是在Map中不能包含两个equals为true的key。 Map对于key,value的类型没有严格要求,只要是引用类型均可。但是为了保证在使用时不会造成数据混乱,通常我们会使用泛型去约束key与value的类型。 1.1.2. put方法 既然我们知道了Map在保存数据时实际上是存入了两部分信息的 ,key与value。那么我们来看看如何向Map中存入数据。 Map提供了一个方法: V put ( K k , V v ) 该方法的作用是将key-value对存入Map中,因为Map中不允许出现重复的key,所以若当次存入的key已经在Map中存在,则是替换value操作,而返回值则为被替换的元素。若此key不存在,那么返回值为null。 1.1.3. get方法 我们学会了如何向Map中存入数据,那么我们再来看看如何获取数据。Map中获取数据的方式是给定Key获取对应的Value。 Map提供了一个方法: V get ( Object key )

[LeetCode] [链表] 相关技巧总结

感情迁移 提交于 2020-02-25 22:47:44
刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 两个指针--链表相关的题目一般都需要用到两个指针:prev指针和cur指针 头插法--主要用于reverse链表 前后指针/slow fast指针--用于检测链表是否存在环 来源: https://www.cnblogs.com/wengle520/p/12316596.html

【最完整系列】JAVA-容器篇-LinkedList源码解析

拟墨画扇 提交于 2020-02-25 22:43:45
简介 LinkedList 顾名思义其本质是一个链表,具体来说是一个双向链表,同时还有2个指针分别对应链表的头和尾。 源码 源码还是跟 ArrayList 一样,从我们常用的代码出发: List<String> a = new LinkedList<>(); a.add("sidfate"); 进入初始化源码: // LinkedList 长度 transient int size = 0 ; // 指向头结点 transient Node < E > first ; // 指向尾节点 transient Node < E > last ; public LinkedList ( ) { } 可以看到默认的构造函数空空如也,需要注意的是链表是以 Node 为基础连接起来的,Node 的结构如下: private static class Node < E > { E item ; Node < E > next ; Node < E > prev ; Node ( Node < E > prev, E element, Node < E > next ) { this.item = element ; this.next = next ; this.prev = prev ; } } Node 结构也很简单,prev 和 next 说明它是一个双向的链表,保存前后 Node 的指针

算法题分析 出入栈问题

你。 提交于 2020-02-25 22:36:44
1. 如果一堆栈的输入序列是aAbBc,输出为 abcBA,那么该堆栈所进行的操作序列是什么? 设P代表入栈,O代表出栈。 首先第一个输入是a ,第一个输出也是a,我们把a进栈,然后再弹出去就可以了: 操作为 PO。 然后,第二个输入是A,进栈,但是不能这个时候弹出去,因为第二个输出应该是b,正好第三个输入为b, 操作为PPO。 然后第四个输入为B,第三个弹出为c,栈里没有c,故继续读取,读到c,弹出。 操作为PPO 现在栈里还有两个数:a , b 所以按顺序出栈即可:OO 最后连起来,即 POPPOPPOOO 2. 若用单向链表实现一个堆栈,当前链表状态为:1->2->3。当对该堆栈执行pop()、push(4)操作后,链表状态变成怎样? 首先注意单向链表只能用栈头结点代表栈顶,因为单向链表只能指向下一个元素,而不能指向前面的元素,故如果栈顶是链表尾,则弹栈以后无法得到新的栈顶。 所以1是栈顶。弹栈,4进栈以后,答案是 4->2->3 来源: CSDN 作者: Dezeming 链接: https://blog.csdn.net/tiao_god/article/details/104503218

leetcode 160.相交链表

走远了吗. 提交于 2020-02-25 22:20:45
题目就不写 了,直接写解题思路。 刚开始想到的是暴力解法,双层循环遍历两个链表,然后对比是否有相同节点,有的话就直接返回,结果翻车了 var getIntersectionNode = function(headA, headB) { var startB = headB if(!headA || !headB){ return null } while(headA){ console.log('A'+headA.val); while (headB) { console.log('B'+headB.val); if(headB.val == headA.val) { return headB.val } headB = headB.next } if(headA.val == headB.val){ return headA.val } headB = startB headA = headA.next } return null }; 判断到4就结束 了,好吧,行不通。 第二种方法: var getIntersectionNode = function(headA, headB) { if (!headA || !headB) { return null; } let a = headA, b = headB; // 相交则返回当前节点,否则返回 null // 当 a、b

PAT B1025 反转链表 (25分)

时光怂恿深爱的人放手 提交于 2020-02-25 22:18:30
题目: 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。 输入格式: 每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤10​5​​)、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。 接下来有 N 行,每行格式为: Address Data Next 其中 Address 是结点地址, Data 是该结点保存的整数数据, Next 是下一结点的地址。 输出格式: 对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。 输入样例: 00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218 输出样例: 00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1 思路

C++ 链表部分逆序

假装没事ソ 提交于 2020-02-25 22:02:05
已知链表头节点指针head,将链表从位置m到n逆序。(不申请额外空间) # include <stdio.h> struct ListNode { int val ; //数据域 ListNode * next ; //指针域 ListNode ( int x ) : val ( x ) , next ( NULL ) { } //构造函数 } ; class Solution { public : Solution ( ) { } ~ Solution ( ) { } ListNode * reverseBetween ( ListNode * head , int m , int n ) { int change_len = n - m + 1 ; ListNode * pre_head = NULL ; ListNode * result = head ; while ( head && -- m ) //如果为while (head && --m),m先自减再判断,判断时经过自减后是从m-1到1,m本身是从m到2,共m-1次循环 //如果为while (head && m--),m先判断再自减,判断时未自减是从m到1,m本身是从m到1,共m次循环 { pre_head = head ; head = head - > next ; } //循环结束时head到达第m个节点,

Java集合

北城余情 提交于 2020-02-25 21:05:48
概述: List , Set, Map都是接口,前两个继承至 Collection 接口, Map 为独立接口 List下有 ArrayList , LinkedList ,Vector Set下有 HashSet , TreeSet ,LinkedHashSet Map下有 Hashtable ,LinkedHashMap, HashMap , TreeMap     常用集合类: ArrayList , LinkedList, HashSet, HashMap Connection接口: —---- List 有序,可重复 ArrayList 优点: 底层数据结构是数组, 查询快,增删慢。 缺点: 线程不安全,效率高 LinkedList 优点: 底层数据结构是链表, 查询慢,增删快。 缺点: 线程不安全,效率高 Vector(已放弃) 优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程安全,效率低 (数据量较大,同时数据查询到条件多的时候选择使用ArrayList       ,增删条件多的时候选择使用LinkehLish   一般情况直接使用ArrayList。) —----Set 无序,唯一 HashSet 底层数据结构是哈希表。 (无序,唯一) 如何来保证元素唯一性? 1.依赖两个方法:hashCode()和equals() LinkedHashSet

JAVA SE基础提要--12:List,Set接口

徘徊边缘 提交于 2020-02-25 19:33:17
0x01.List接口 概述: java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对象称为List集合。 它是一个元素存取有序的集合。 集合中可以有重复的元素。 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素。 常用方法: public void add ( int index , E element ) //将指定的元素,添加到该集合中的指定位置上。 public E get ( int index ) //返回集合中指定位置的元素。 public E set ( int index , E element ) //用指定元素替换集合中指定位置的元素,返回值的更新前的元素。 public E remove ( int index ) //移除列表中指定位置的元素, 返回的是被移除的元素。 ArrayList集合: java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList`是最常用的集合。 LinkedList集合: java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合 LinkedList是一个双向链表

剑指offer学习笔记 链表中倒数第k个节点

a 夏天 提交于 2020-02-25 19:28:31
鲁棒是英文Robust的音译,有时也翻译成健壮性。鲁棒性指程序能够判断输入是否合乎规范要求,并对不符合要求的输入予以合适的处理。 容错性是鲁棒性的一个重要体现,不鲁棒的软件在发生异常事件时,如用户输入错误的用户名、试图打开的文件不存在或者网络不能连接,会出现不可预见的诡异行为,或者干脆整个软件崩溃。 提高代码的鲁棒性的有效途径是进行预防性编程,预防性编程是一种编程习惯,指预见在什么地方可能会出现问题,并为这些可能出现的问题制定处理方式。如当试图打开的文件不存在时,可以提示用户检查文件名和路径。 面试时最简单实用的防御性编程是在函数入口对用户的输入是否符合要求进行验证。如输入的是一个指针,那么空指针时怎样进行处理。 面试题22:链表中倒数第k个节点。输入一个链表,输出该链表中倒数第k个节点。为符合大多数人习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。链表节点定义如下: struct ListNode { int m_nValue ; ListNode * m_pNext ; } ; 为了得到倒数第k个节点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是本题中的链表是单向链表,只有从前向后的指针而没有从后向前的指针,这种思路行不通。 假设整个链表有n个节点,那么倒数第k个节点就是从头结点开始的第n-k+1个节点(头节点为第一个节点)。因此,如果我们能够得到链表的长度n