链表

ARTS第九周

你说的曾经没有我的故事 提交于 2020-02-27 17:14:02
ARTS第九周 ARTS是什么? Algorithm :每周至少做一个leetcode的算法题; Review :阅读并点评至少一篇英文技术文章; Tip/Techni :学习至少一个技术技巧; Share :分享一篇有观点和思考的技术文章。 Algorithm 题目: 21. Merge Two Sorted Lists 解题思路 此题要求我们合并两个排好序的链表,合并之后的链表要求也是有序的,因此我们在每次做合并操作的时候需要比较两个链表头节点的大小,较小的那个节点加到新链表的尾端。 同时,取较小节点的下一个节点与刚才比较过的较大的节点比较,再把较小的那个节点加到新链表的尾端,重复这两个操作,直到遍历完其中一个链表。 代码 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null){ return l2; } if (l2 == null){ return l1; } if (l1.val < l2.val){ l1.next = mergeTwoLists(l1.next, l2); return l1; }else{ l2.next = mergeTwoLists(l2.next, l1); return l2; } } Review 详见: 一.Java技术现象 Tip/Techni

堆、栈、堆栈、队列的区别

怎甘沉沦 提交于 2020-02-27 17:02:18
堆栈都是一种 数据项 按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 要点:堆:顺序随意 栈:后进先出(Last-In/First-Out) 堆 堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 ④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 栈 栈:什么是栈?又该怎么理解呢? ①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出) ③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。 堆栈 堆栈

「算法」环形链表 & 环形链表 II

徘徊边缘 提交于 2020-02-27 14:03:04
00141 环形链表 题目描述 给定一个链表,判断链表中是否有环。 实例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。 力扣地址 https://leetcode.com/problems/linked-list-cycle https://leetcode-cn.com/problems/linked-list-cycle 解题报告 哈希表 本题解由微信公众号 小猿刷题 提供, 错误之处, 欢迎指正. 通过检查一个结点此前是否被访问过来判断链表是否为环形链表。常用的方法是使用哈希表. /** * 微信公众号"小猿刷题" * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public boolean

从尾到头打印链表

无人久伴 提交于 2020-02-27 12:26:29
输入一个链表,从尾到头打印链表每个节点的值。 递归到最后,在一个个的添加进List 1234567891011121314 public ArrayList<Integer> (ListNode listNode) { ArrayList<Integer> res = new ArrayList<>(); printListFromTailToHead(listNode, res); return res;}public void (ListNode node, List<Integer> res) { if (node != null) { printListFromTailToHead(node.next, res); res.add(node.val); }} 使用栈从头到尾装入所有节点即可,因为栈先进后出的特性,在弹出的时候就是从尾到头 123456789101112131415 public ArrayList<Integer> (ListNode listNode) { ArrayList<Integer> res = new ArrayList<>(); Stack<ListNode> stack = new Stack<>(); ListNode node = listNode; while (node != null) { stack.add(node);

数据结构第二章

吃可爱长大的小学妹 提交于 2020-02-27 09:44:13
数据结构的第二章课程知识点 文章目录 数据结构的第二章课程知识点 名词简称 数据结构的体系 抽象数据类型 抽象数据类型的框架 抽象数据类型的表现和实现 线性结构 线性结构的基本特征 线性表 线性表的类型定义 抽象数据类型线性表(ADT List) 线性表的基本操作 **顺序表** 名词简称 名词 意义 DS(Data Strucuture) 数据结构 ADT/Abstract Date Type 抽象数据类型 List 线性表 SeqList/SqList 顺序表 LinkedList/LinkList/LIST 链表 数据结构的体系 是一种 线性结构 非线性结构 List SqList LinkList 顺序存储 链表存储 关系/逻辑结构 线性表 栈 队列 双队列 串 ...... 树 图 DS.数据结构 存储/物理结构 顺序存储 ..... 抽象数据类型 注: (A为 抽象 、B为 数据 、T为 类型 ) ADT Complex{ ① 数据对象 : D={e1,e2| e1,e2∈ RealSet } ② 数据关系 : R={<e1,e2>| e1 是复数的 实数部分 , e2 是负数的 虚数部分 。 ③ 基本操作 : AssignComplex(&Z,V1, V2) 操作结果:构造复数Z,其实部和虚部分别被赋以参数V1和V2的值。 DestroyComplex(&Z)

LeetCode 21 ——合并两个有序链表

爱⌒轻易说出口 提交于 2020-02-27 09:12:58
1. 题目 2. 解答 新建一个带有哨兵结点的链表,依次比较两个有序链表的结点值,将较小值的结点插入到新链表后面。直到其中一个比较完毕,将另一个链表剩余的结点全部放到新链表最后面即可。最后,可以删除哨兵结点,或者直接返回哨兵结点后第一个结点指针。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode *head = new ListNode(0); // 新建哨兵结点,方便操作 ListNode *temp = head; // 依次比较两个链表的结点值,将值较小的结点插入到新建的链表后面 while(l1 && l2) { if (l2->val <= l1->val) { temp->next = l2; temp = temp->next; l2 = l2->next; } else { temp->next = l1; temp = temp->next; l1 = l1-

「算法」验证回文串 & 回文链表

∥☆過路亽.° 提交于 2020-02-27 08:08:03
00125 验证回文串 题目描述 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false 力扣地址 https://leetcode.com/problems/valid-palindrome/ https://leetcode-cn.com/problems/valid-palindrome/ 解题报告 采用双指针 本题解由微信公众号 小猿刷题 提供, 错误之处, 欢迎指正. 分别从头部和尾部进行扫描(只扫描字母和数字), 比较对应位置是否相同字母(考虑到存在大小写,所以统一转换为大/小写进行比较), 对应位字母不同则表示不是回文串,直至比较结束,均相等则表示是回文串. /** * 微信公众号"小猿刷题" */ class Solution { public boolean isPalindrome(String s) { int i = 0; int j = s.length() - 1; while(i <= j) { char ci = s.charAt(i); char cj = s.charAt(j); if(

数据结构之栈-c语言实现

非 Y 不嫁゛ 提交于 2020-02-27 07:47:06
文章来源: http://blog.seclibs.com/数据结构之栈-c语言实现/ 在上一篇文章中说过,栈在实现上分为顺序栈和链式栈两种。 顺序栈: 用数组实现的栈 链式栈: 用链表实现的栈 因为栈就是一种“功能受限”的顺序表,所以在实现的时候,在之前数组和链表的基础上进行修改即可达到效果。 顺序栈 在实现顺序栈的时候,为了更好的表示栈顶元素top,我将之前数组中的使用个数used替换为top,在其他方面并没有太大的变化。 需要下载代码请移步至文末。 链式栈 链式栈在原先链表的基础上省去了不少内容,像按位置插入,删除指定内容等,这些都是由于栈的特性决定了只能从一端进行插入和删除,也正是因为如此,所以在单链表的基础上进行修改的,使用双链表没有太大的意义。 需要下载代码请移步至文末。 代码: 顺序栈: GitHub 链式栈: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客: http://blog.seclibs.com/ 安全库: http://www.seclibs.com/ 来源: oschina 链接: https://my.oschina.net/u/3677719/blog/3162273

epoll 接口以及原理说明

我与影子孤独终老i 提交于 2020-02-27 07:09:01
实例代码 : https://github.com/xuchanglong/NtyTCP-v1.0.0-comments 主要接口 int epoll_create(int size) 创建 epoll 对象,同时创建一个空的 红黑树 以及空的 双向链表 ,返回 epoll 对象的文件描述符。 int epoll_ctl(int epid, int op, int sockid, struct epoll_event *event); 向 epoll 对象里面的红黑树中增加、删除、修改指定的节点。 int epoll_wait(int epid, struct epoll_event *events, int maxevents, int timeout); 等待双向链表中是否有节点,若有节点则取得不大于 maxevents 数量的节点并放入 events 中,最后返回。 int epoll_event_callback(struct eventpoll *ep, int sockid, uint32_t event) 有 显卡驱动 调用,判断当前事件(建立连接、断开连接、读写数据)对应的 socket 是否已经在红黑树中挂号,如果是,则将新的事件保存到对应的红黑树节点中并更新到双向链表中。 原理说明 1、上文在说明函数功能时提到了两个 epoll 核心结构: 红黑树 和 双向链表

LeetCode刷题笔记 160

瘦欲@ 提交于 2020-02-27 04:20:41
题目:相交链表 编写一个程序,找到两个单链表相交的起始节点。 答案: 参考链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/xiang-jiao-lian-biao-by-leetcode/ 1.暴力法 对链表A中的每一个结点 ai ,遍历整个链表 B 并检查链表 B 中是否存在结点和 ai相同。 时间复杂度 : O(mn)。 空间复杂度 : O(1)。 2.哈希表 遍历链表 A 并将每个结点的地址/引用存储在哈希表中。然后检查链表 B 中的每一个结点 bi是否在哈希表中。若在,则 bi为相交结点。 时间复杂度 : O(m+n)。 空间复杂度 : O(m)或O(n)。 3.双指针法 创建两个指针 pA和pB,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。 当 pA到达链表的尾部时,将它重定位到链表 B 的头结点; 类似的,当 pB到达链表的尾部时,将它重定位到链表 A 的头结点。 若在某一时刻 pA和pB相遇,则 pA/pB为相交结点。 解释: 假设链表A、B长度分别为a、b,假设a-b = c,即a比b长c长度(具体谁比谁长无所谓)。 我们需要消除A、B的长度差c,即两个指针在距尾结点距离都为b(较短链表的长度)时,同时往后遍历