链表

剑指Offer--复杂链表的复制

走远了吗. 提交于 2020-03-01 17:57:51
题目 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空); 我的思路 先不管特殊指针,先完成链表的复制,然后在循环给特殊指针赋值; 自己写的low代码 /* public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } */ public class Solution { public RandomListNode Clone(RandomListNode pHead) { if (pHead == null) { return null; } RandomListNode head = new RandomListNode(-1); // 头指针; RandomListNode q = head; RandomListNode p = pHead; // 先不管random while (p != null) {// RandomListNode newNode = new

剑指offerNo56. 删除链表中重复的结点(Java)

守給你的承諾、 提交于 2020-03-01 16:41:10
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 遍历节点的同时判断当前节点与下一个节点是否相同,如果相同则删除, 删除方法 使用相同节点的前一个节点,指向相同节点的下一个节点 代码: package offer01; public class TestNo56 { static class ListNode{ int val ; ListNode next = null; ListNode(int val){ this.val = val; } public String toString(){ if(this.next == null){ return String.valueOf(this.val); }else{ return this.val+ "->" + this.next.toString(); } } } public static void main(String[] args) { ListNode head = new ListNode(1); ListNode node1 = new ListNode(2); ListNode node2 = new ListNode(2); ListNode node3 =

单链表的(实现头插、删,尾插、删,任意位置插、删)

廉价感情. 提交于 2020-03-01 16:34:49
//函数声明 #pragma once typedef int DataType; typedef struct SLNode { int data; struct SLNode* next; }SLNode; // 尾插/删 void PushBack(SLNode** head, DataType data); void PopBack(SLNode** head); // 头插/删 void PushFront(SLNode** head, DataType data); void PopFront(SLNode** head); //打印 void Print(SLNode* head); //在任意位置插入节点 void SLInsertAfter(SLNode* pos, DataType data); //在任意位置删除节点 void SLErase(SLNode**head, SLNode* pos); //链表的长度 int SLSize(SLNode* head); //寻找值为data的位置 SLNode* SLFind(SLNode* head, int data); //销毁链表 void Destroy(SLNode** head); ////////////////////////////////////////////////////////////

LeetCoed:两数相加 题解

為{幸葍}努か 提交于 2020-03-01 16:29:29
1.题目描述 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 2.题解 一道简单的链表问题,注意处理特殊情况: (1)使用头节点统一操作 (2)检查进位 (3)两个初始链表不一定一样长 3.代码(Java) 1.算法代码 ListNode addTwoNumbers ( ListNode l1 , ListNode l2 ) { //进位 int carry = 0 ; int t1 , t2 , sum ; //头节点,目的是统一操作,返回时返回 头节点.next ListNode headNode = new ListNode ( 0 ) ; ListNode current = headNode ; while ( l1

Java编程的逻辑 (40) - 剖析HashMap

淺唱寂寞╮ 提交于 2020-03-01 16:19:38
前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用?是如何实现的?本节详细介绍。 字面上看,HashMap由两个单词组成,Hash和Map,这里Map不是地图的意思,而是表示映射关系,是一个接口,实现Map接口有多种方式,HashMap实现的方式利用了Hash。 下面,我们先来看Map接口,接着看如何使用HashMap,然后看实现原理,最后我们总结分析HashMap的特点。 Map接口 基本概念 Map有键和值的概念,一个键映射到一个值,Map按照键存储和访问值,键不能重复,即一个键只会存储一份,给同一个键重复设值会覆盖原来的值。使用Map可以方便地处理需要根据键访问对象的场景,比如: 一个词典应用,键可以为单词,值可以为单词信息类,包括含义、发音、例句等。 统计和记录一本书中所有单词出现的次数,可以以单词为键,出现次数为值。 管理配置文件中的配置项,配置项是典型的键值对。 根据身份证号查询人员信息,身份证号为键,人员信息为值。 数组、ArrayList、LinkedList可以视为一种特殊的Map,键为索引,值为对象。 接口定义 Map接口的定义为: public interface Map<K,V> { V put(K key, V

循环单链表,解决约瑟夫问题

℡╲_俬逩灬. 提交于 2020-03-01 14:23:47
约瑟夫问题: 编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数),开始任选一个正整数作为报数上限值M,从第1个人按顺时针方向自1开始顺序报数,报到M时停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,如此下去,直至所有人全部出列为止。 解析: 显然当有人退出圆圈后,报数的工作要从下一个人开始继续,而剩下的人仍然围成一个圆圈,因此可以使用循环单链表。退出圆圈的工作对应着表中节点的删除操作,对于这种删除操作频繁的情况,选用效率较高的链表结构,为了程序指针每次都指向一个具体的代表一个人的节点而不需要判断,链表不带头节点。因此,对于所有人围成的圆圈所对应的数据结构采用一个不带头节点的循环链表来描述。 1 #include "stdafx.h" 2 #include <iostream> 3 #include "string.h" 4 using namespace std; 5 6 typedef struct node 7 { 8 int data; 9 node *next; 10 }node; 11 12 node *create(int n) //创建节点数量为n的单向循环链表 13 { 14 node *pRet = NULL; 15 if(n != 0) 16 { 17 int n_idx = 1; 18 node *p

总线,设备,驱动的关系

冷暖自知 提交于 2020-03-01 14:03:57
转载: https://blog.csdn.net/tangtang_yue/article/details/51036598 kobject,kset是设备模型的基本结构体,设备模型使用这两个结构体来过程设备的层次关系,但在实际的设备驱动编写中,我们基本用不到kobject,kset这些结构体,是因为这些结构体又被嵌入到更大的结构体如bus,drivers,devices中,原因在于kobject,kset结构体只能表征设备的层次关系,但是一个设备的驱动,并不是简单的一个层次关系而已,因此,必须把kobject,kset结构体嵌入到更大的结构体中,使用kobject,kset来表征层次关系,用其他的成员表示设备驱动的具体功能。 在设备模型中,我们将看到,设备驱动注意是由总线,驱动程序,设备三个部分构成,通过这三个标准部件,把各种纷繁杂乱的设备鬼节过来,达到简化设备驱动编写的目的,也即我们编写的设备驱动,起始也只是这三部分的一个很小的部分。 我们编写的设备驱动程序,一定是先属于一个总线的驱动,比如usb总线,PCI总线,IC总线等等。因为我们编写的设备驱动,在注册,安装到系统时,系统会先检查驱动是属于哪个总线的(设备驱动编写时已经定义好),会把驱动加入到对应的总线的kset中,即把当前设备驱动的kobject加入到对应总线的kset中,形成层次关联。而当系统检测到有设备存在(硬件)

【剑指offer】反转链表 -- Python 实现

﹥>﹥吖頭↗ 提交于 2020-03-01 12:26:28
【题目描述】 输入一个链表,反转链表后,输出新链表的表头。 【解题思路】 新建一个链表,然后遍历输入的链表,不断让新链表下一次的next值指向当前新创建的链表表头,用Python实现的代码如下: # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回ListNode def ReverseList(self, pHead): # write code here if pHead == None or pHead.next == None: return pHead lastList = None while pHead: tmpList = pHead.next pHead.next = lastList lastList = pHead pHead = tmpList return lastList 来源: CSDN 作者: CC‘s World 链接: https://blog.csdn.net/qq_36643449/article/details/104588806

pta题解

喜夏-厌秋 提交于 2020-03-01 12:04:14
pta题解 习题2.4 递增的整数序列链表的插入 (15分) 这道题先申请一个空间然后把数据存进去,然后从头开始遍历,如果比当前遍历到的小,那么就插在它的前面。通过q,和l两个指针,l一直往下遍历,然后更新q,这样会比较容易插入,要注意考虑,可能会一直遍历到最尾部才满足条件 List Insert ( List L , ElementType X ) { List head = L ; L = L -> Next ; List p = ( List ) malloc ( sizeof ( struct Node ) ) ; p -> Data = X ; p -> Next = NULL ; List q = head ; while ( L -> Data < X ) //循环遍历 { q = L ; //更新q L = L -> Next ; //l指针往后移动 if ( L -> Next == NULL ) { L -> Next = p ; return head ; } } p -> Next = L ; q -> Next = p ; return head ; } 习题2.5 两个有序链表序列的合并 (15分) 这道题本来我没有思路,以为要新建一个链表,后来看了别人的题解才有了思路,这道题就是建立一个头结点,然后比较两个链表,小的就插进去,然后向后移,然后继续比较

HashMap和ConcurrentHashMap

大城市里の小女人 提交于 2020-03-01 09:36:03
目录 HashMap Java7中HashMap(数组+单向链表) ​ Java8中的HashMap(数组+链表+红黑树) ConcurrentHashMap Java7中的ConcurrentHashMap Java8中的ConcurrentHashMap(引入红黑树) HashMap HashMap 根据键的 hashCode 值存储数据 ,大多数情况下可以直接定位到它的值,因而具有很快 的访问速度,但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null ,允许多条记 录的值为 null。 HashMap 非线程安全 ,即任一时刻可以有多个线程同时写 HashMap,可能会导 致数据的不一致。 如果需要满足线程安全, 可以用 Collections 的 synchronizedMap 方法使 HashMap 具有线程安全的能力 ,或者 使用 ConcurrentHashMap 。 Java7中HashMap(数组+单向链表) 大方向上, HashMap 里面是一个 数组 ,然后数组中每个元素是一个 单向链表 。上图中,每个绿色 的实体是嵌套类 Entry 的实例, Entry 包含四个属性: key, value, hash 值和用于单向链表的 next 。 1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。