链表

常见的单链表题目

不羁岁月 提交于 2020-02-29 22:10:10
1、判断一个单链表中是否有环 思路:给定两个指针fast和low都指向头结点,然后low每次前进一步,fast每次前进两步,如果此单链表中有环,那么fast和low一定会相遇,否则fast一定会先遇到null。实现代码如下: bool isCircle(LinkList *head){ LinkList *fast = head;//快指针 LinkList *low = head;//慢指针 while(low->next != NULL && fast->next->next != NULL) { low = low->next; fast = fast->next->next; if (low == fast) { return true; } } return false;} 现在还有个问题需要思考, 为什么如果链表有环,fast和low就一定会相遇呢? 假设单链表长度为n,且该单链表是环状的。 ① 若low和fast的起点相同,那么第i次迭代时,low指向元素(i mod n),q指向(2i mod n)。因此当i≡2i(mod n)时,fast和low相遇。而i≡2i(mod n) → (2i-i)mod n=0 → (i mod n) = 0 →当i=n时,fast和low相遇。 ② 若low和fast的起点不同,假设第i次迭代时low指向元素(i mod n)

深信服面试2020春招一面c/c++

人走茶凉 提交于 2020-02-29 21:58:18
好几个问题蒙了,,还是太紧张 比较struct大小,能不能用memcmp为什么 按位(bit)定义结构体怎么操作 怎么判断两个链表是否交叉 用hash去除大量url中重复的url 快排思想,复杂度,最坏情况 堆排序,大顶小顶,从大量数据中找到最大值,时间复杂度 static的用法,特性 tcp三次握手,第三次丢失会怎么样,针对此问题引起的攻击,怎么设计防火墙 tcp是怎么可靠传输的 100层楼,用2个球,最坏几次测试找到该楼层 计算一个文件的长度 链表能不能二分查找为什么,二分时间复杂度 udp去connect tcp会发生什么 malloc与new区别,用free去释放new出来的对象会发生什么 记不住了。。。我还是太菜 来源: CSDN 作者: ejdjdk 链接: https://blog.csdn.net/weixin_42281802/article/details/104576565

链表的应用(LRU缓存淘汰算法)

江枫思渺然 提交于 2020-02-29 20:41:18
缓存:是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。 LRU:缓存的大小有限,当缓存被用满时数据有的需要删除,有的需要保留,这里我们采用的策略是LRU(最近最少使用)缓存淘汰算法。 LRU缓存淘汰算法:我们维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。 1. 如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。 2. 如果此数据没有在缓存链表中,又可以分为两种情况: 如果此时缓存未满,则将此结点直接插入到链表的头部; 如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。 来源: CSDN 作者: UCSD☁️ 链接: https://blog.csdn.net/qq_43536300/article/details/104573084

LeetCode92:反转链表II

白昼怎懂夜的黑 提交于 2020-02-29 20:40:49
/* 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL */ /* */ class Solution { public : ListNode * reverseBetween ( ListNode * head , int m , int n ) { ListNode * pre = NULL ; ListNode * cur = head ; while ( m > 1 ) { //先让pre指向m位置的前一个元素,cur指向m位置的元素 pre = cur ; cur = cur - > next ; m -- ; n -- ; } //用p1来记录pre的值,用p2来记录cur的值,因为之后p1和p2要指向别的位置 ListNode * p1 = pre ; ListNode * p2 = cur ; while ( n > 0 ) { //开始翻转 ListNode * next = cur - > next ; cur - > next = pre ; pre = cur ; cur = next ; n -- ; } //翻转完成后让p1指向pre的位置,让p2指向cur的位置

内核定时任务timer_list

孤人 提交于 2020-02-29 19:35:54
使用定时器任务,可以让内核在将来的一个指定时刻执行一段指定的代码。内核定时器相关的接口在linux/timer.h文件中。 本文将会先介绍定时任务的使用,然后在此基础上了解其内部的实现逻辑。 一、定时任务结构体表示: struct timer_list { struct list_head entry; //用于链接到内核定时器链表中 unsigned long expires; //定时任务过期时间 void (*function)(unsigned long); //定时任务的工作函数 unsigned long data; //定时任务工作函数参数 struct tvec_base *base; //定时任务关联的内核定时器 #ifdef CONFIG_TIMER_STATS void *start_site; char start_comm[16]; int start_pid; #endif #ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map; #endif }; 二、定时任务相关的接口: 1. 初始化定时任务 #define TIMER_INITIALIZER(_function, _expires, _data) { \ .entry = { .prev = TIMER_ENTRY_STATIC }, \

36.两个链表的第一个公共节点(java)

北城以北 提交于 2020-02-29 19:32:30
题目描述 输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 解题思路 假定 List1长度: a+n List2 长度:b+n, 且 a<b。那么 p1 会先到链表尾部, 这时p2 走到 a+n位置,将p1换成List2头部,接着p2 再走b+n-(n+a) =b-a 步到链表尾部,这时p1也走到List2的b-a位置,还差a步就到可能的第一个公共节点。将p2换成 List1头部,p2走a步也到可能的第一个公共节点。如果恰好p1==p2,那么p1就是第一个公共节点。或者p1和p2一起走n步到达列表尾部,二者没有公共节点,退出循环。同理a>=b. 时间复杂度O(n+a+b) 注意:节点相同意味着next也相同,所以也说明两个链表有相同的尾部。 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode p1 = pHead1; ListNode p2 =

6-6 学生成绩链表处理 (20分)

时间秒杀一切 提交于 2020-02-29 16:47:45
本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。 函数接口定义: struct stud_node * createlist ( ) ; struct stud_node * deletelist ( struct stud_node * head , int min_score ) ; 函数createlist利用scanf从输入中获取学生的信息,将其组织成单向链表,并返回链表头指针。链表节点结构定义如下: struct stud_node { int num ; /*学号*/ char name [ 20 ] ; /*姓名*/ int score ; /*成绩*/ struct stud_node * next ; /*指向下个结点的指针*/ } ; 输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。 函数deletelist从以head为头指针的链表中删除成绩低于min_score的学生,并返回结果链表的头指针。 # include <stdio.h> # include <stdlib.h> struct stud_node { int num ; char name [ 20 ] ; int score ; struct stud_node * next ; } ; struct stud_node

单链表的数组实现

爱⌒轻易说出口 提交于 2020-02-29 15:42:01
单链表的数组实现 解 决 图 和 树 的 存 储 问 题 。 解决图和树的存储问题。 解 决 图 和 树 的 存 储 问 题 。 题目: 实现一个单链表,链表初始为空,支持三种操作: (1) 向链表头插入一个数; (2) 删除第k个插入的数后面的数; (3) 在第k个插入的数后插入一个数 现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。 注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。 输入格式 第一行包含整数M,表示操作次数。 接下来M行,每行包含一个操作命令,操作命令可能为以下几种: (1) “H x”,表示向链表头插入一个数x。 (2) “D k”,表示删除第k个输入的数后面的数(当k为0时,表示删除头结点)。 (3) “I k x”,表示在第k个输入的数后面插入一个数x(此操作中k均大于0)。 输出格式 共一行,将整个链表从头到尾输出。 数据范围 1≤M≤100000 所有操作保证合法。 输入样例: 10 H 9 I 1 1 D 1 D 0 H 6 I 3 6 I 4 5 I 4 5 I 3 4 D 6 输出样例: 6 4 6 5 $$ 代码: 注意点: 插 入 、 删 除 操 作 都 是 对 第 k 个 数 后 面 的 数 进

简单聊一下数组和链表

旧时模样 提交于 2020-02-29 14:12:57
写在前面 数组和链表是数据结构中最基础的两种结构,其他的都是由这两者转化而来; 因此,掌握这两种结构至关重要!下面,时光就带大家来学习一下数组和链表; 思维导图: 1,什么是线性表? 线性表是具有 相同类型 的n(>=0)个数据元素的 有限序列 (a0,a1,a2,…,an),ai是表项,n是表长度; 那么为什么要提到线性表呢? 因为数组和链表都是线性表的结构,只不过它们的存储方式不一样; 根据存储方式不同,可将线性表分为 顺序表 和 链式表 ; 线性表是数据结构中的逻辑结构。可以存储在数组上,也可以存储在链表上。 一句话,用 数组来存储的线性表就是顺序表 。 2,数组和链表 数组 :在内存中,是一块连续的内存区域; 链表 :是由不连续的内存空间组成; 3,数组和链表的区别 数组优点: 随机访问性强,查找速度快(连续内存空间导致的); 数组缺点: 插入和删除效率低 可能浪费内存 内存空间要求高,必须有足够的连续内存空间。 数组大小固定,不能动态拓展 链表的优点: 插入删除速度快 内存利用率高,不会浪费内存 大小没有固定,拓展很灵活。 (每一个数据存储了下一个数据的地址,增删效率高) **链表的缺点:**不能随机查找,必须从第一个开始遍历,查找效率低 4,数组和链表的代码实现 说了这么多,让我们用代码来写一个数组和链表。 数组: 1,先写一个实体类DynamicArray;

第02次作业-线性表

巧了我就是萌 提交于 2020-02-29 07:35:21
---恢复内容开始--- 1.题目1: 题目: 6-2 线性表元素的区间删除(20 分) 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。 2. 设计思路(伪代码或流程图) 不同与课堂派上的题目,需要比较将元素与最大值和最小值进行比较 List Delete( List L, ElementType minD, ElementType maxD ){ int i,j=0,k,d; k=0;**k来计算删去的节点量 for(i=0;i<=L->Last;i++){ if(L->Data[i]>minD&&L->Data[i]<maxD){**判断节点是否满足条件,若满足则删去 k++; } else{ L->Data[j++]=L->Data[i]; } } L->Last=L->Last-k; 删去被删掉的节点的长度 return L; } 3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染) 4.PTA提交列表说明。 将这道题目与课堂派小测上的题目弄混 1.题目1:题目名称 6-3 jmu-ds-链表倒数第m个数(20 分) 已知一个带有表头节点的单链表,查找链表中倒数第m个位置上的节点。 输入要求:先输入链表结点个数,再输入链表数据,再输入m表示倒数第m个位置。