链表

leetcode--61--旋转链表

与世无争的帅哥 提交于 2020-03-04 18:26:47
题目描述: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 示例 1 : 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL 示例 2 : 输入: 0->1->2->NULL, k = 4 输出: 2->0->1->NULL 解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL 向右旋转 3 步: 0->1->2->NULL 向右旋转 4 步: 2->0->1->NULL 解题思路1: 当链表在向右移动时, 移动的步数k有可能大于链表的长度。 移动链表后会让原链表的头和尾首尾相接,这就相当于是找一个环形链表的断开点, 找到这个新链表的头节点。因此, 将原链表尾节点指向头节点, 将原链表改造成一个环形链表. 根据移动步数k计算链表的断开点. 将断开的节点做头结点, 同时把新的尾节点置空. 代码: python class ListNode ( object ) : def __init__ ( self , x ) : self . val = x self . next = None class Solution (

HashMap源码深度解析

大城市里の小女人 提交于 2020-03-04 18:20:07
HashMap源码深度解析 一、重新认识HashMap 什么是HashMap? HashMap底层基于散列(Hash)算法,采用hash表实现键值对集合,继承了AbstractMap,实现了Map接口。最早出现在jdk1.2,允许null键和null值,null键的哈希值为0。需要注意的是HashMap不保证键值对顺序,同时非线程安全。 长啥样? 散列算法分为散列再探测和拉链式,HashMap采用的是拉链式,并在jdk1.8后使用红黑树优化长度大于等于8的链表。也就是说,目前HashMap底层数据结构为: 数组+链表+红黑树 。 数据结构如下图: 如上图所示,HashMap的数据结构采用数组和单链表(或者红黑树)组成,在进行增删改查时首先根据要查找元素的hash值定位到元素所在的数组下标(也称为桶),然后再根据这个桶所存储的元素的类型(单个node,单链表或红黑树)来找到该元素。 当单链表长度大于等于8时,转化为红黑树;当红黑树长度小于6时红黑树转化为链表。 HashMap特点 可以接受null键和null值,null键的hash值时0; 元素无序,可以序列化,线程不安全; 添加,查询的时间复杂度基本都是O(1); 存储元素时,根据键的hash值找到对应的桶。如果出现不同的对象计算出来的hash值相同,也就是hash冲突。为了解决这个问题

习题11-8 单链表结点删除 (20分)

僤鯓⒐⒋嵵緔 提交于 2020-03-04 16:58:12
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下: struct ListNode { int data ; ListNode * next ; } ; 函数接口定义: struct ListNode * readlist ( ) ; struct ListNode * deletem ( struct ListNode * L , int m ) ; 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。 函数deletem将单链表L中所有存储了m的结点删除。返回指向结果链表头结点的指针。 裁判测试程序样例: # include <stdio.h> # include <stdlib.h> struct ListNode { int data ; struct ListNode * next ; } ; struct ListNode * readlist ( ) ; struct ListNode * deletem ( struct ListNode * L , int m ) ; void printlist ( struct ListNode * L ) { struct ListNode * p = L ; while ( p ) {

Java容器

瘦欲@ 提交于 2020-03-04 16:22:48
Java容器 Java中容器类可以分为两大类:Collection与Map。 Collection:存储对象的集合; Map:存储键值对。 Collection Set TreeSet 基于红黑树,支持有序性操作。 HashSet 基于哈希表实现,支持快速查找,不支持有序性操作。 LinkedHashSet 基于双向链表实现,只能顺序访问,可以快速在其中间插入和删除元素。 List ArrayList 基于动态数组实现,支持随机访问。 ArrayList源码 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable //基于数组实现,RandomAccess表示支持随机访问。 private static final int DEFAULT_CAPACITY = 10; //默认大小为10 private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if

链表的创建、遍历、删除、插入和清空

十年热恋 提交于 2020-03-04 16:19:25
一、链表的概念   链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 二、链表和数组的区别: 1、数组静态分配内存,链表动态分配内存。 2、数组在内存中是连续的,链表是不连续的。 3、数组利用下标定位,查找的时间复杂度是O(1),链表通过遍历定位元素,查找的时间复杂度是O(N)。 4、数组插入和删除需要移动其他元素,时间复杂度是O(N),链表的插入或删除不需要移动其他元素,时间复杂度是O(1)。 数组的优点 1、随机访问性比较强,可以通过下标进行快速定位。 2、查找速度快 数组的缺点 1、插入和删除的效率低,需要移动其他元素。 2、会造成内存的浪费,因为内存是连续的,所以在申请数组的时候就必须规定七内存的大小,如果不合适,就会造成内存的浪费。 3、内存空间要求高,创建一个数组,必须要有足够的连续内存空间。 4、数组的大小是固定的,在创建数组的时候就已经规定好,不能动态拓展。 链表的优点 1、插入和删除的效率高,只需要改变指针的指向就可以进行插入和删除。 2、内存利用率高,不会浪费内存,可以使用内存中细小的不连续的空间,只有在需要的时候才去创建空间。大小不固定,拓展很灵活。 链表的缺点 查找的效率低,因为链表是从第一个节点向后遍历查找。 单链表和双链表 三、链表环问题 判断是否有环    定义一个快指针和一个慢指针

给定一个链表,判断链表中是否有环(Java实现)

守給你的承諾、 提交于 2020-03-04 14:38:40
public class LinkedList { //给定一个链表,判断链表中是否有环 class ListNode { int val ; ListNode next ; ListNode ( int x ) { val = x ; } } public boolean hasCycle ( ListNode head ) { //先判断链表是否合法 if ( head == null ) { return false ; } //快慢指针法,创建两个指针,快指针 fast 一次走两步,慢指针 slow 一次走一步,如果相遇,表示有环,否则无环 ListNode fast = head ; ListNode slow = head ; while ( fast != null && fast . next != null ) { fast = fast . next . next ; slow = slow . next ; if ( fast == slow ) { return true ; } } return false ; } } 来源: CSDN 作者: JIAYU. 链接: https://blog.csdn.net/qq_45914985/article/details/104650636

【剑指Offer】15.反转链表(Python实现)

隐身守侯 提交于 2020-03-04 11:28:05
题目描述 输入一个链表,反转链表后,输出新链表的表头。 解法一:循环法 # -*- 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 is None: return pHead last = None #指向上一个节点 while pHead: # 先用tmp保存pHead的下一个节点的信息, # 保证单链表不会因为失去pHead节点的next而就此断裂 tmp = pHead.next # 保存完next,就可以让pHead的next指向last了 pHead.next = last # 让last,pHead依次向后移动一个节点,继续下一次的指针反转 last = pHead pHead = tmp return lastleetcode 解法二:递归法 # 递归 # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class

C++静态链表的实现(包括各操作的成员函数)

[亡魂溺海] 提交于 2020-03-04 10:29:49
静态链表是用数组描述的链表,其实是为了给没有指针的语言设计的单链表的方法。尽管可能用不上,但这种思考方式是还是很巧妙的,利用游标来实现指针的作用,应该理解这种思想以备不时之需 ,网上找的c++代码基本都有c的痕迹,就自己学了一天,其中加了大量的注释,希望对其他初学者有所帮助 1 #include<iostream> 2 #include<ctime> 3 #include<cstdlib> 4 using namespace std; 5 #define MAXSIZE 1000 6 7 #ifndef LIST_H 8 #define LIST_H 9 class node{//创建结点结构,包括数据和游标,游标记录下一个元素所对应的下标 10 public: 11 int cur; 12 int data; 13 }; 14 15 class List{ 16 public: 17 List();//无参数的构造函数 18 bool CreateList(int size);//初始链表 19 int new_sl();//模仿普通链表的new分配内存空间 20 void delete_sl(int i);//模仿普通链表的delete释放内存空间,这个形参i代表链表中将要释放的元素的下标 21 void ClearList();//清空链表 22 bool ListEmpty

LeetCode 86. 分隔链表

人走茶凉 提交于 2020-03-04 10:21:15
题目链接: https://leetcode-cn.com/problems/partition-list/ 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * struct ListNode *next; 6 * }; 7 */ 8 9 struct ListNode* partition(struct ListNode* head, int x){ 10 if(head==NULL||head->next==NULL) return head; 11 struct ListNode *front=(struct ListNode*)malloc(sizeof(struct ListNode)); 12 struct ListNode *rear=(struct ListNode*)malloc(sizeof(struct ListNode)); 13 struct ListNode *q=head,

Redis——学习之路一(初识redis)

帅比萌擦擦* 提交于 2020-03-04 10:04:53
  在接下来的一段时间里面我要将自己学习的redis整理一遍,下面是我整理的一些资料:   Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store),所以redis是可以查看源代码 https://github.com/MSOpenTech/redis/tree/3.0 。 它是通常被称为数据结构服务器,因为值(value)可以使字符串(string)、哈希(hashes)、列表(list)、集合(sets),和有序集合(sorted sets)类型。   在将redis类型以前我们先在自己的电脑上安装一下redis,打开 这个链接 选择2.8.2400这个版本,下载msi。msi是安装版本,zip是免安装版本。区别在于msi安装版本安装后可以以服务的形式存在。需要注意的是redis安装包没有32位系统的只有64位的   安装到D盘中,如下   接下来再看看我们的服务有一个redis的服务,而且该服务已经启动。   然后我就使用(redis-cli.exe)客户端连接redis服务。连接redis服务器的命令为redis-cli.exe -h 127.0.0.1 -p 6379 -auth 密码   先开打运行程序输入“cmd”然后如下:   因为默认端口为6379所有可以不用-p 6379 ,同时刚安装默认情况下没有密码