链表

java实现顺序链表

微笑、不失礼 提交于 2020-03-31 06:39:00
C&C++是那么难学,以至于我连指针是什么都不知道。所以只能学习java了。 如今想用java实现N年前学过“数据结构(c语言版)”却又是那么吃力! 慢慢练吧! 写此博客,仅标记自己学过数据结构。以《数据结构(C语言版)》-严蔚敏 书本为参考。 顺序链表的java类文件:SequenceList.java文件 package list; public class SequenceList { private int LIST_INIT_SIZE = 5;//链表的原始大小 private int INCREMENT =1;//链表的增量大小 private Object []SqList = null;//链表 private int curIndex=0;//当前位置 /** * 初始化链表 * */ public void initList() { SqList = new Object[LIST_INIT_SIZE]; } /** * 向链表中插入元素 * */ public void insertList(Object o) { if(curIndex>LIST_INIT_SIZE-1)//判断当前链表是否已经满 { //从新为链表分配空间 System.out.println("从新分配空间"); LIST_INIT_SIZE+=INCREMENT; Object [

链表中倒数第k个结点

感情迁移 提交于 2020-03-31 02:58:23
题目描述 输入一个链表,输出该链表中倒数第k个结点。 可以用两个指针实现,first和second均指向头指针,将second指针后移动k-1位,然后再将两个指针同时往后 移动,直到second的next指向空。唯一需要注意的就是输入的k必须为正数,且不能超过链表的长度。 public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(k<=0||head==null){ return null; } ListNode first=head; ListNode second=head; for(int i=0;i<k-1;i++){ if(second.next==null){ return null; }else{ second=second.next; } } while(second.next!=null){ first=first.next; second=second.next; } return first; } } 来源: https://www.cnblogs.com/huangbei1990/p/5742422.html

4L-线性表之数组

假装没事ソ 提交于 2020-03-30 15:06:21
关注公众号 MageByte,设置星标点「在看」是我们创造好文的动力。后台回复 “加群” 进入技术交流群获更多技术成长。 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素。 你一定会说数组这么简单,有啥说的。嘿嘿嘿,里面包含的玄机可不一定每个人都知道。 今天的疑惑来了….. 数组几乎都是从 0 开始编号的,有没有想过 为啥数组从 0 开始编号,而不是从 1 开始呢? 使用 1 不是更符合人类的思维么? 数组简介 数组是一种线性表数据结构,用一组连续的内存空间来存储一组具有相同类型的数据。 里面出现了几个重要关键字,线性表、连续内存空间和相同类型数据,这里解释下每个关键词的含义。 线性表 就是数据排成像线一样的结构,就像我们的高铁 G1024 号,每节车厢首尾相连,数据最多只有「前」和「后」两个方向。除了数组,链表,队列,栈都是线性结构。 非线性表 比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。 连续的内存空间 正式由于它具有连续的内存空间和相同的数据类型的数据。就有一个牛逼特性:「随机访问」。很多人面试的时候一定被问数组与链表有什么区别?多数会回答 “链表适合插入、删除,时间复杂度 O(1);数组适合查找,查找时间复杂度为 O(1)”。

212

▼魔方 西西 提交于 2020-03-30 12:33:24
数据结构 在 JDK1.8 中,HashMap 是由 数组+链表+红黑树 构成 当一个值中要存储到HashMap中的时候会根据Key的值来计算出他的hash,通过hash值来确认存放到数组中的位置,如果发生hash冲突就以链表的形式存储,当链表过长的话,HashMap会把这个链表转换成红黑树来存储 在看源码之前我们需要先看看一些基本属性 //默认初始容量为16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //默认负载因子为0.75 static final float DEFAULT_LOAD_FACTOR = 0.75f; //Hash数组(在resize()中初始化) transient Node<K,V>[] table; //元素个数 transient int size; //容量阈值(元素个数超过该值会自动扩容) int threshold; table数组里面存放的是Node对象,Node是HashMap的一个内部类,用来表示 来源: https://www.cnblogs.com/miaowwwww/p/12597353.html

重点题目

此生再无相见时 提交于 2020-03-30 10:21:11
LeetCode 83. 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。 LeetCode 695. 岛屿的最大面积 最大岛问题(我想了个分治,思路不对,直接爆炸,面试官还是不错的,给我换了道题) 编程题2:股票利润1(还要求写测试用例,要求跑通) 编程题3:股票利润2(可以买卖多次)(这两题都秒了,面试前一晚正好想刷一刷dp的题,就刷了这两题,所以说大家想到什么一定要去学!!!) 编程题1:股票利润1 编程题2:股票利润3(可以买卖两次)(查了下,就是股票利润3,hard) 二分查找,输出下标 19.长度为10的数组,0~9的数字无序且可重复,找出重复的数字,要求:时间复杂度O(n),空间复杂度O(1);(有人会的话请粘到评论区,多谢,注意时间和空间复杂度) public class Main{ public static void main(String[] args) { int[] arr = {1,1,1,1,2,4,4,6,6,6}; for (int i = 0; i < arr.length; i++) { int index = arr[i]; if (index == i || index == -1){ continue; }else if (index != arr[index] && arr[index] !=

linux 内核定时器 timer_list详解

允我心安 提交于 2020-03-30 01:20:20
http://www.linux-cn.com/html/linux/kernel/20070412/1886.shtml http://linux.ccidnet.com/art/741/20061116/952655_1.html Linux内核2.4版中去掉了老版本内核中的静态定时器机制,而只留下动态定时器。相应地在timer_bh()函数中也不再通 过run_old_timers()函数来运行老式的静态定时器。动态定时器与静态定时器这二个概念是相对于Linux内核定时器机 制的可扩展功能而言的,动态定时器是指内核的定时器队列是可以动态变化的,然而就定时器本身而言,二者并无本质的 区别。考虑到静态定时器机制的能力有限,因此Linux内核2.4版中完全去掉了以前的静态定时器机制。 7.6.1 Linux内核对定时器的描述 Linux在include/linux/timer.h头文件中定义了数据结构timer_list来描述一个内核定时器: struct timer_list { struct list_head list; unsigned long expires; unsigned long data; void (*function)(unsigned long); }; 各数据成员的含义如下: (1)双向链表元素list:用来将多个定时器连接成一条双向循环队列。 (2

Java集合类——Set、List、Map、Queue接口

旧街凉风 提交于 2020-03-29 20:23:42
目录 Java 集合类的基本概念 Java 集合类的层次关系 Java 集合类的应用场景 一. Java集合类的基本概念 在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定且不可变,如果我们需要保存一个动态增长的数据(其数量不确定),Java集合类可以很好实现。 集合类又称为容器类。所有的集合类都位于 java.util 包下,为了处理多线程环境下的并发安全问题,在 java.util.concurrent 包下提供了一些多线程支持的集合类。 Java集合类可分为两大类: 1)Collection : 1.1)List必须保持元素特定的顺序 1.2)Set不能有重复元素 1.3)Queue保持一个队列(先进先出)的顺序 2)Map : 保存的是一组 “键值对” 对象 (key-value对) 【虚线箭头表示实现关系,实线箭头表示继承关系】 二. Java集合类的层次关系 1. Iterable<T> 接口 java.lang 下的 Interface Iterable<T> 迭代器接口,是Collecton接口的父接口,包括 default void forEach() 方法 Iterator<T> iterator() 方法 【Iterator<T> 是java.util 下的接口】 实现这个Iterable接口的对象允许使用foreach进行遍历

面试题二十三:如果一个链表中包含环链,如何找到环的入口

早过忘川 提交于 2020-03-29 15:10:56
方法一:步骤1.确定环存在:指针A一次走一步,指针B一次走两步,如果相遇则出现环。 步骤2。确定环的数量:A继续走,b不动,计数k,再次相遇则可得计数结果 步骤3. 寻找入口:指针A从头结点先走k步,然后一起向前,相遇时的节点就是入口 来源: https://www.cnblogs.com/niliuxiaocheng/p/12592253.html

【剑指】25.合并有序链表 & 21. Merge Two Sorted Lists

大城市里の小女人 提交于 2020-03-29 13:35:30
21. Merge Two Sorted Lists 递归 不需要dummy head, 因为可以确定是返回哪个头节点 func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { if l1 ==nil{ return l2 } if l2 == nil{ return l1 } // 1-3 2-4 var head *ListNode if l1.Val < l2.Val{ head = l1 // in 1(head) (3 2-4) newHead := mergeTwoLists(l1.Next,l2) // out sub 1 (2-3-4) // sub to father 1->(2-3-4) head.Next = newHead }else{ head = l2 newHead := mergeTwoLists(l1,l2.Next) head.Next = newHead } return head } https://leetcode-cn.com/submissions/detail/57614448/ 迭代 Q: 为什么迭代解法需要用dummy A: 如果不用dummy,那么往新链表添加节点就用2种情况: 空链表添加节点 和 非空链表添加节点,这就产生了2套添加逻辑

一些面试题,转关注的一个博客

一个人想着一个人 提交于 2020-03-29 12:13:37
腾讯面试题: tcp 三次握手的过程, accept 发生在三次握手哪个阶段? 答accept发生在三次握手之后。 第一次握手:客户端发送syn包(syn=j)到服务器。 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。 三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接。 const 的含义及实现机制,比如: const int i, 是怎么做到 i 只可读的? const用来说明所定义的变量是只读的。 这些在编译期间完成,编译器可能使用常数直接替换掉对此变量的引用。 用 UDP 协议通讯时怎样得知目标机是否获得了数据包 可以在每个数据包中插入一个唯一的ID,比如timestamp或者递增的int。 发送方在发送数据时将此ID和发送时间记录在本地。 接收方在收到数据后将ID再发给发送方作为回应。 发送方如果收到回应,则知道接收方已经收到相应的数据包;如果在指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,直到确定对方收到。 求一个论坛的在线人数,假设有一个论坛,其注册 ID 有两亿个,每个 ID 从登陆到退出会向一个日志文件中记下登陆时间和退出时间