链表

数据-第12课-线性表课后练习

我们两清 提交于 2020-03-02 06:45:57
第12课-线性表课后练习 1. 静态链表的改进 l 将数组中的空闲结点链接成空闲链表。 优势:插入新元素时,可以直接得到空闲位置。 2. 实现双向循环链表 提示 l 注意头结点的插入和删除。 l 注意尾结点的插入和删除。 3. 面试题精选 (1) 在无表头结点的单链表中,无法直接知道长度length。 (2) 写程序找出链表的中间结点。 (3) 要求:只能遍历一次链表。 来源: https://www.cnblogs.com/free-1122/p/11322755.html

leetcode-链表

点点圈 提交于 2020-03-02 04:28:40
这两题链表都是关于反转的 206.反转链表 1.用三个指针 Java跟c不同,没有指针的概念,所以访问下一个是用.next的方式。java的空为null 注意空指针问题,链表末端只有一个空值,指向空值.next会发生错误。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList ( ListNode head ) { if ( head == null || head . next == null ) return head ; else { ListNode a , b , c ; a = head ; b = a . next ; c = b . next ; a . next = null ; if ( c == null ) { b . next = a ; a . next = null ; } else { while ( c != null ) { b . next = a ; a = b ; b = c ; c = c . next ; } b . next = a ;

常用数据结构以及数据结构的排序算法

耗尽温柔 提交于 2020-03-02 02:39:24
数组 (Array)   在程序设计中,为了处理方便, 把具有相同类型的若干 变量 按有序的形式组织起来。这些按序排列的同类数据元素的集合称为 数组 。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、 指针数组 、结构数组等各种类别。 栈 (Stack)   是只能在某一端插入和删除的特殊 线性表 。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 队列 (Queue)   一种特殊的 线性表 ,它只允许在表的 前端 (front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 链表 (Linked List)   是一种物理存储单元上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时 动态 生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 树 (Tree)   是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:  

c语言文本局部修改

好久不见. 提交于 2020-03-02 01:03:55
文章目录 一、借助新建文件 二、文件指针定位覆盖 1. 得到待修改的数据在文件中的位置 2. 将文件内部指针定位到该位置 3. 写入新数据到文件 两种方法修改局部数据 一、借助新建文件 //已在内存中修改过单行数据后直接调用该函数 void RebuildFile ( List a ) //List为结构体指针,指针a指向已修改部分链表 { int num1 ; char name1 [ 100 ] ; double source ; FILE * p1 = fopen ( "...\\date.txt" , "r" ) ; FILE * p2 = fopen ( "...\\date2.txt" , "w+" ) ; //新建date2.txt while ( fscanf ( p1 , "%d%s%lf" , & num1 , name1 , & source ) == 3 ) { if ( strcmp ( a -> name , name1 ) ) //未修改部分直接存入 fprintf ( p2 , "%d %s %.2lf\n" , num1 , name1 , source ) ; else fprintf ( p2 , "%d %s %.2lf\n" , a -> num , a -> name , a -> source ) ; //修改后数据存入 }

LeetCode笔记之双指针(一)

只愿长相守 提交于 2020-03-01 22:08:28
双指针在算法中无论是数组还是链表类题目中都是重要且常见的“套路”之一。 两数之和 输入一个 递增排序 的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 巧用双指针 class Solution { public int[] twoSum(int[] nums, int target) { int[] ret = new int[2];     //首尾各一个指针,根据有序性移动指针 int index1=0,index2 = nums.length-1; while(index1<index2&&nums[index1]+nums[index2]!=target){ if(nums[index1]+nums[index2]<target){ index1++; }else{ index2--; } } ret[0] = nums[index1]; ret[1] = nums[index2]; return ret; }} 最接近的三数之和 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 先固定一个数,然后前后各一个指针,进行遍历找最接近! class Solution { public

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

☆樱花仙子☆ 提交于 2020-03-01 21:41:39
习题11-8 单链表结点删除 (20分) 本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下: 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) {

2-5反转链表一部分

痴心易碎 提交于 2020-03-01 21:30:24
题目描述 解题方法1 其实和反转整个链表是一个原理,依然使用头插的方法。只需要将第from-1个节点当成头节点,将第to个节点当成最后一个节点即可。 首先遍历一遍链表,找到第from-1个节点phead和第to+1个节点ptail。 然后反转from–to的部分,最后再将反转后的链表与节点ptail连接起来。 代码如下: public class Test { public static void main ( String [ ] args ) throws Exception { int [ ] arr = { 10 , 20 , 30 , 40 , 50 } ; Node head = create ( arr ) ; reverse ( head , 2 , 4 ) ; for ( Node p = head . next ; p != null ; p = p . next ) { System . out . println ( p . val ) ; } } //反转链表一部分 public static Node reverse ( Node head , int from , int to ) { if ( head == null || head . next == null ) { return head ; } int len = 0 ; //链表长度

反转链表指定位置

耗尽温柔 提交于 2020-03-01 21:17:35
题目 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list-ii 算法思路 首先找到要反转的位置,从n位置开始。 要反转一个结点cur: 要使用prev引用记住它的前结点 再一个curNext引用记住它的后驱结点 反转下一个时,更新prev和curNext 反转2~4位置结点 到这里还没有结束: 还需要将1的next改为4结点 2的next改为5结点 所以最开始之前,必须借用front引用保存m位置的前驱prev。 找到m位置后,使用引用rear保存此节点。 最后改变引用指向: 这里还要注意m位置若是从1开始的画front==null,本例中表示从1开始,但要把这种情况考虑进去。 最后分两种情况: (1)front==null: 此时头结点变为prev,rear.next=cur; (2)front!=null:front.next=prev,rear.next=cur. 代码 class Solution { public ListNode

Redis5源码阅读【7-quicklist】

核能气质少年 提交于 2020-03-01 20:14:48
文章目录 1、介绍 2、quicklist 2.1、List 2.2、quicklist 2.2.1、quicklistNode 2.2.2、quicklistLZF 2.2.2、quicklistEntry 2.2.3、quicklistIter 3、数据压缩 3.1、压缩 3.2、解压缩 4、基本操作 4.1、初始化 4.2、添加元素 4.3、删除元素 4.4、更改元素 4.5、查找元素 5、常用API 1、介绍 quicklist是Redis底层最重要的数据结构之一,它是Redis对外提供的6种基本数据结构中List的底层实现。在quicklist之前,Redis采用压缩链表(ziplist)和双向链表(adlist)作为List的底层实现。当元素个数较少并且元素长度比较小时,Redis采用ziplist作为其底层存储,当元素长度较多时候,Redis采用adlist作为底层存储结构,因为修改元素的时候ziplist需要重新分配空间,这会导致效率降低。 2、quicklist quicklist由List 和 ziplist 组合而成,ziplist在前面的文章种已经介绍了。本章将会基于ziplist继续介绍quicklist。 2.1、List 链表是一种线性结构,其中各对象按线性顺序排列。链表与数组不同点在于,数组的顺序由下标决定,链表的顺序由对象的指针决定

LeetCode 92.Reverse Linked List2.链表逆序(指定逆序的位置)

微笑、不失礼 提交于 2020-03-01 20:05:27
已知链表头结点指针head,将链表从位置m到n逆序。 这里选取的是2,4两个位置。 #include < stdio . h > #include < iostream > using namespace std ; struct ListNode { int val ; ListNode * next ; ListNode ( int x ) : val ( x ) , next ( NULL ) { } } ; class Solution { public : ListNode * reverseBetween ( ListNode * head , int m , int n ) { int change_len = n - m + 1 ; //一共有多少个数字 //cout<<change_len<<endl; ListNode * pre_head = NULL ; ListNode * result = head ; //cout<<head->val<<endl;//应该是1 while ( head && -- m ) { pre_head = head ; head = head - > next ; } ListNode * modify_list_tail = head ; // //cout<<head->val<<endl;//2 ListNode *