链表

打印两个有序链表的公共部分

佐手、 提交于 2020-04-03 20:09:50
问题描述: 给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。 算法实现: public void printCommonPart(Node head1, Node head2) { System.out.println("Common Part: "); while (head1 != null && head2 != null) { if(head1.value < head2.value) { head1 = head1.next; } else if(head1.value > head2.value) { head2 = head2.next; } else { System.out.print(head1.value + " "); head1 = head1.next; head2 = head2.next; } } System.out.println();}public class Node { public int value; public Node next; public Node(int value) { this.value = value; }} 算法解析: 1.仔细审题,得到问题的关键信息,像本题的“有序”、“头指针”等关键字; 2.对于当前题目,通过循环遍历,首先进行非空判断,其中任何一个头指针移动到null,过程即停止;

数据结构-线性表(2)

南笙酒味 提交于 2020-04-03 18:42:00
线性表定义: 线性表是最基本、最简单、也是最经常使用的一种数据结构。 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其他数据元素都是首尾相接的。 线性表的逻辑结构简单,便于实现和操作。因此,线性表这样的数据结构在实际应用中是广泛採用的一种数据结构。 存储空间是否连续: 一、顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻。而且。顺序表的存储空间须要预先分配。 长处: (1)方法简单,各种高级语言中都有数组。easy实现。 (2)不用为表示节点间的逻辑关系而添加额外的存储开销。 (3)顺序表具有按元素序号随机訪问的特点。 缺点: (1)在顺序表中做插入、删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低。 (2)须要预先分配足够大的存储空间,预计过大,可能会导致顺序表后部大量闲置;预先分配过小。又会造成溢出。 二、在链表中逻辑上相邻的数据元素,物理存储位置不一定相邻,它使用指针实现元素之间的逻辑关系。而且。链表的存储空间是动态分配的。 长处 :插入、删除运算方便。 缺点: (1)要占用额外的存储空间存储元素之间的关系,存储密度减少。存储密度是指一个节点中数据元素所占的存储单元和整个节点所占的存储单元之比。 (2)链表不是一种随机存储结构。不能随机存取元素 链表的操作: 针对双向链表来说,如图: 删除结点: 代码 : p->prior-

Linux 15 进程地址空间

大憨熊 提交于 2020-04-02 13:37:34
15.1 进程只能访问有效内存区域的内存地址,每个内存地址都有相关权限可以让相关进程可读、可写、可执行。如果一个内存访问了不在有效范围内的内存区域时,或以不正确的方式访问内存区域,内核会终止该进程。并报段错误。 有效内存中的对象有: -可执行文件代码的内存映射,称为代码段/文本段。 -已初始化的全局或静态变量的内存映射,称为数据段; -未初始化的全局或静态数据的零页映射,称为bss段; -用于进程用户空间栈的零页内存映射,栈段; -每一个诸如C库或动态链接库等共享库的代码段、数据段和bss段也会被载入进程地址空间; -任何内存映射文件; -任何共享内存段; -任何匿名的内存映射,比如由malloc()申请的内存; 其中后4个都是堆区。 15.2 内存描述符 mm_struct 内核使用内存描述符结构体表示进程的地址空间,该结构包含了和进程地址空间有关的全部信息。用mm_struct表示。 其中mm_users成员表示该地址空间的进程引用数; 其中mmap和mm_rb都表示地址空间的各个内存对象,前者用链表表示,后者用红黑树表示; 所有的mm_struct结构体都通过自身的mmlist域连接在一个双向链表中,该链表首元素是init_mm内存描述符,它表示init的地址空间; mmlist_lock用于访问上述链表时的同步控制。 task_struct的mm域指向了进程的内存描述符

83-删除排序链表中的重复元素

放肆的年华 提交于 2020-04-02 07:18:53
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 public ListNode deleteDuplicates(ListNode head) { ListNode a=head; if (head==null||head.next==null) { return head; } ListNode b=head.next; while(b!=null) { if(b.val!=a.val) { a=b; b=b.next; }else{ b=b.next; a.next=b; } } return head; } 来源: https://www.cnblogs.com/dloading/p/10863268.html

445. Add Two Numbers II 题解报告(链表)

两盒软妹~` 提交于 2020-04-02 05:54:31
ListNode* reverseKGroup(ListNode* head, int k) { // if(!head||k==1)return head; int cnt=0; ListNode* p = head, *newh = new ListNode(0), *pre = newh; while(p){ //找到第k+1个节点p while(p&&cnt!=k){ cnt++; p = p->next; } if(cnt!=k){ pre->next = head; break; } else{ //反转之后的最后一个节点 ListNode *last = head; while(cnt>0){ ListNode *nxt = head->next; head->next = p; p = head; head = nxt; cnt --;//尽量不要在while循环判断语句中加上--或者++ } //上一次反转的最后节点衔接这一次反转的头结点 pre->next = p; //初始化 p = head; pre = last; } } return newh->next; } 非递归 【例子1】445. Add Two Numbers II You are given two non-empty linked lists representing two non

java集合之Map接口

时光怂恿深爱的人放手 提交于 2020-04-02 05:12:51
一、Map的实现类大概结构: ---Map:双列数据,存储key-value对的数据(类似于高中的函数)   ---HashMap:作为Map的主要实现类;线程不安全,效率高。可以存储null的key和value     ---LinkedHashMap:作为HashMap的子类,保证在遍历map元素时,可以按照添加的顺序实现遍历。因为它在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个。对于频繁的遍历操作,此类执行效率高于HashMap。   ---TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序。底层使用红黑树。   ---Hashtable:作为古老的实现类,比Map还早,1.0就有。线程安全的,效率低。不可以存储null的key和value。     ---Properties:常用来处理配置文件。key和value都是String类型 HashMap的底层:数组+链表(JDK7.0及之前)          数组+链表+红黑树(JDK8.0) 二、Map结构的理解: Map中的key:无序的、不可重复的,使用set存储所有的key。——>key所在类要重写equals()和hashCode()。 Map中的value:无序的、可重复的,使用Collection存储所有的value。——

C:无空头链表

邮差的信 提交于 2020-04-01 06:31:03
1.链表的结构体以及全局变量声明 #include <stdio.h> #include <stdlib.h> // 创建Node结构体 struct Node { int a; struct Node * pNext; }; //链表头尾指针 struct Node* g_pHead = NULL; //刚开始链表头部为null(头部:内容,该节点的内容存储) struct Node* g_pEnd = NULL; //刚开始链表尾部为null      头尾都为null,表示空头链表 2.创建链表函数(插尾法和插头法) ①插尾插入法 //创建链表,在链表中增加一个数据,尾添加 (g_pEnd发生变化,但是g_pHead不变化,只与第一个传入的Temp有关) void AddListTail(int a) { //创建一个结点 struct Node * pTemp = (struct Node*)malloc(sizeof(struct Node)); //结点数据进行赋值 pTemp->a = a; pTemp->pNext = NULL; //链接 if(NULL == g_pHead || NULL == g_pEnd) //也就是刚开始,头尾都是空,其实写一个就可以,头是空,尾就是空 { g_pHead = pTemp; //此时pTemp的地址既是头也是尾

Leetcode 237.删除链表中的节点 By Python

半世苍凉 提交于 2020-04-01 03:20:48
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 -> 9 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9], node = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9. 说明: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表中的一个有效节点。 不要从你的函数中返回任何结果。 思路 以图中的样例为例: 4 -> 5 -> 1 -> 9 4 -> 1 -> 1 -> 9 4 -> 1 -> 9 代码 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def

这就是搜索引擎--读书笔记四--索引基础

ぐ巨炮叔叔 提交于 2020-03-31 07:32:19
搜索引擎索引基础 前几天我阅读了搜索引擎索引这一章,发现倒排索引这一方法确实很巧妙和迷人,它包含的原理和设计方法很独到。所以接下来,我想把我学习到的索引方面的知识给大家讲解一下,总共分为三篇: 索引基础 、 索引建立和更新 、 索引查询 。 我们首先认识倒排索引基本概念 文档 : 一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖了更多形式,比如Word、PDF、HTML、XML等不同格式的文件都可以称为文档。 文档集合 :由若干文档构成的集合称为文档集合。 文档编号 :在搜索引擎内部,会为文档集合中每一个文档赋予一个唯一的内部编号,以此编号来作为文档的唯一标识,这样方便内部处理。每个文档的内部编号称为文档编号。 单词编号 :和文档编号类似,单词编号可以作为某个单词的唯一表征。 倒排索引 :倒排索引是实现单词—文档矩阵的一种具体存储形式。通过倒排索引,可以通过单词快速获取包含这个单词的文档列表。倒排索引由两个部分组成:单词词典和倒排文件。 单词词典 :搜索引起通常的索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息及指向倒排列表的指针(还记得链表吗?亲)。 倒排文件 :所有单词的倒排列表往往顺序的存储在磁盘的某个文件里,这个文件即被称为倒排文件

linklist

人盡茶涼 提交于 2020-03-31 07:11:25
1. list类型简介 2. c++代码实现及stl中list的使用示例 3. 代码下载 1. list类型简单介绍 list表示线性表类型,能够动态改变长度。可以使用数组或者是链表的形式进行存储。数组形式如下: 这里使用的是链表表示,并且带有头节点。定义其上的操作如下: 1. 插入元素:insertNode 2. 删除元素:deleteNode 3. 查找元素:search 2. c++代码实现及stl中list使用示例 c++实现代码如下: #include <iostream> using namespace std; struct MyListNode { int m_nValue; MyListNode* next; }; // 带头节点 class MyList { // 数据成员 private : MyListNode* m_pHead; // 操作 public : // 打印链表 void print() { MyListNode* node = m_pHead->next; while(node != NULL) { cout << node->m_nValue << endl; node = node->next; } cout << "--------------------------" << endl; } // 构造函数 MyList() { //