展开

关键词

中倒数第k个 中倒数第k个

题目描述输入一个,输出该中倒数第k个。解题思路经典的双指针法。 定义两个指针,第一个指针从的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从的头指针开始遍历,由于两个指针的距离保持在k-1,当第一个指针到达的尾节时,第二个指针刚好指向倒数第 k个节头指针是否为空,若为空则直接返回回null 2. k是否为0,k为0也就是要查找倒数第0个节,由于计数一般是从1开始的,所有输入0没有实际意义,返回null 3. k是否超出的长度,如果的节个数少于 FindKthToTail(ListNode head,int k) { if(head == null || k == 0) return null; ListNode temp = head; 判断k是否超过的个数

16920

、头指针、头

同时,由于最后一个数据元素没有直接后继,则线性中最后一个的指针为“空”(NULL)。?图1 线性的逻辑状态由上述描述可见,单可由头指针来唯一确定,在C语言中可用“构指针”来描述。 ;  有时在单的第一个之前附设一个,称之为头 。 它的特中最后一个节的指针域指向头,整个形成一个环。由此,从中任一出发均可找到中其他,如图3所示为单的循环 。? ;   struct DuLNode  *next;  }DuLNode, *DuLinkList;  和单的循环类似,双向也可以有循环,如图5(c)所示,中存有两个环,图5(b)所示为只有一个的空 图5 双向示例 (a)构;(b)空的双向循环;(c)非空的双向循环

45270
  • 广告
    关闭

    云加社区有奖调研

    参与社区用户调研,赢腾讯定制礼

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    的中间

    的中间 的中间 给定一个带有头 head 的非空单,返回的中间。 如果有两个中间,则返回第二个中间。 示例 1: 输入:输出:此列中的 3 (序列化形式:)返回的值为 3 。 (测评系统对该序列化述是 )。 示例2: 输入:输出:此列中的 4 (序列化形式:)由于该列有两个中间,值分别为 3 和 4,我们返回第二个。 提示: 给定数介于 1 和 100 之间。 解题思路 定义一个快指针fast 一个慢指针slow ,快指针一次移动两个,慢指针一次移动一个 当fast到达的尾部时,慢指针也就移动到了的中间(同化成一个路程问题,同一段路程,

    11730

    C语言 | 建立,输出各中的数据

    例42:C语言实现一个简单,它由3个学生数据的组成,要求输出各中的数据。 解题思路:读者在学习这道例题的时候,应该首先分析三个问题。各个是怎么样构成的?没有头指针head行不行?  main()主函数 {  struct student a,b,c;定义构体变量   struct student *head,*point;定义构体指针变量   a.num=10101;学号赋值 89.5;成绩赋值   b.num=10103;学号赋值   b.score=90.0;成绩赋值   c.num=10107;学号赋值   c.score=85.0;成绩赋值   head=&a;将第1个的起始地址赋给头指针 head  a.next=&b;将第2个的起始地址赋给第1个的next成员  b.next=&c;将第3个的起始地址赋给第2个的next成员   c.next=NULL;第3个的next  exited after 0.04469 seconds with return value 0请按任意键继续. . .C语言 | 建立,输出各中的数据更多案例可以go公众号:C语言入门到精通

    1762418

    全国二级C知识6-构体、、共用体

    4.知识l 当一个构体中有一个或多个成员的基类型就是本构体类型时,通常把这种构体称为可以“引用自身的构体”,也称为“构”? l 对进行的操作通常有以下四种:1.建立带有头的单向2.顺序访问单向数据域的值(即遍历)struct std{int data; *数据域* struct std * next ; *指针域*};…建立头和数个节,即建立以下 ? 历: p=head;while(p!=0){ printf(%4d,p->data); p=p->next;}}3.删除单向中的某个 ? >next->n也可示为x.n,输出4例1:(2009-03-15)以下程序把三个NODETYPE型的变量接成一个简单的,并在while循环中输出数据域中的数据,请填空#include

    24930

    中环的入口

    题目描述给一个,若其中包含环,请找出该的环的入口,否则,输出null。解题思路一种方法是用 hashmap来存储和查找节; 另一种方法是双指针法。 假设环长度为n,进入环之前个数为x,slow在环内走了k个,fast绕环走了m圈,则有2(x+k)=x+mn+k 可以得出x = mn - k。 此时slow距入口还剩 n-k个,x=(m−1)n+n−k,即一个指针从头节走到环入口的长度等于另一个指针从相遇的位置走 m-1圈后再走n-k的长度,也就是说两个指针相遇后,让一个指针回到头节 所以,我们设置两个指针,一个是快指针fast,一个是慢指针slow,fast一次走两步,slow一次走一步,如果单有环那么当两个指针相遇时一定在环内。 此时将一个指针指到头部,另一个不变,二者同时每次向前移一格,当两个指针再次相遇时即为环的入口节。如果fast走到null则无环。

    25030

    的中间

    的中间) https:leetcode-cn.comproblemsmiddle-of-the-linked-list 题目描述 给定一个头为 head 的非空单,返回的中间。 如果有两个中间,则返回第二个中间。   示例 1: 输入:输出:此列中的 3 (序列化形式:)返回的值为 3 。 (测评系统对该序列化述是 )。 示例 2: 输入:输出:此列中的 4 (序列化形式:)由于该列有两个中间,值分别为 3 和 4,我们返回第二个。   提示: 给定数介于 1 和 100 之间。

    700

    Linux C 数据构 ->单向

    简介  是Linux 内核中最简单,最普通的数据构。 是一种存放和操作可变数量元素(常称为节)  的数据构,和静态数组的不同之处在于,它所包含的元素都是动态创建并插入的,在编译  时不必知道具体需要创建多少个元素,另外也因为中每个元素的创建时间各不相同 根据它的特性,可分为:单,双,单向循环和双向循环,今天总记录的就是  最简单的单,  1.1 节类型描述   1 typedef struct node_t {   2 data_t 这时,就引入了头  的概念,头和其他节数据类型一样,只是数据域为NULL,head->next = NULL,下面  我们看一个创建空的函数,如何利用头来创建一个空,只要头节在, ,比如数据插入函数,我们就要尽可能  考虑所有能出现的果,比如:1)如果需插入数据的是个空;2)所插入的位置超过了的  长度;如果我们的函数能包含所有能出现的情况,不仅能大大提高我们的开发效率

    22600

    删除中重复的

    题目描述在一个排序的中,存在重复的,请删除该中重复的,重复的不保留,返回头指针。 例如,1->2->3->3->4->4->5 处理后为 1->2->5解题思路首先添加一个头节,以方便碰到第一个,第二个节就相同的情况设置 first ,second 指针, first 指针指向当前确定不重复的那个节

    19320

    Day55:中环的入口

    剑指Offer_编程题——中环的入口题目描述: 给一个,若其中包含环,请找出该的环入口节,否则,输出null。 首先给大家介绍两个快慢指针的论: 1、设置快慢指针,假如有环,他们最后一定相遇。 2、两个指针分别从头和相遇继续出发,每次走一步,最后一定相遇与环入口。   接下来我们分别证明论1、2。 这个过程类似于中倒数第K个中思路三的做法。因此,我们论一就已经证明完毕了。 二、论2的证明:   首先我们画一个带环的示意图,如下图所示: ?    即:直接判断中是否有环,然后得到环中节的数目,最后就是在环中找到入口节,具体我们用java将其实现。 但是在本地编译器中我们还需要定义构才能正常运行,具体用Java定义构实现如下:public class ListNode { int val; ListNode next = null; ListNode

    14931

    LeetCode知识&题型总

    坚持一两个月,你会发现你的感觉逐渐好起来了废话不多说了,开始进入今天的正文,LeetCode知识&题型总知识什么是(Linked List)是一种常见的线性构。 头用来记录的基地址,知道头我们就可以遍历得到整条。尾的特殊在于指针指向的是一个空指针NULL。 循环​ 循环是一种特殊的单,与单不同的是尾节不指向空地址,指向的头。优是从尾到头比较方便,当要处理的数据具有环形构特是,非常适合用循环来处理。 第一,引入哨兵。如我们开头说的 dummy node 。在任何时候,不管是不是空,head都会一直指向这个哨兵。我们也把这种有哨兵叫做带头。 第二,双指针法。 为空中只有一个中只包含两个代码在处理头跟尾是否存在什么问题参考资料:1.https:leetcode-cn.comproblemssort-listdiscuss46714Java-merge-sort-solution2

    47310

    ​单 C++

    C++ 题目 1、创建单 2、初始化单 3、释放单 4、获取单中元素的数量 5、输出单中的所有数据 6、获取单中指定位置的元素 7、根据键值查找指定元素 8、采用头插法向单中插入一个元素 9、采用尾插法向单中插入一个元素 10、向单中的指定位置插入一个元素 11、删除指定位置的元素 设计类图 文件构 效果 store.h #pragma once store.h 储存的构体 单 0 号节为头节 1号节开始存储内容class list {public: list(); 构造函数 ~list(); 析构函数 int getLength(); 获得长度 list ); 插入指定位置的元素 list* deleteNode(const int& loc); 删除节 list* reverse(); 反转 Node* TwoPoints(); 一分为二 ,返回第二个的头private: Node* head; int length=NULL; 的长度 string result = ; 临时保存果 string error;

    38020

    C++ 单

    C++ 实现单(类似python的list类型)。涉及到的基础知识有:构体(指针做构元素)类 (构造函数、拷贝构造函数)指针和引用的相关概念? 目前我实现的功能有:的打印,尾部添加数据,中间任意位置插入数据,删除指定位置的数据 和 查找数据。 源码如下:#include using namespace std; struct Node 构体做节{ 每个节包含一个数据(可以改成复合类型的数据)和指向下一个节的指针 float v; struct Node *p;}; class List{private: struct Node *headP; 指向头节的指针 struct Node *tailP; 指向尾巴节的指针public: int

    16920

    数据构——(C语言实现)

    提起,我们每个人都不会陌生,不管对数据构的掌握如何,都或多或少的听过与用过这样的常见的数据构。 最大的特就是在每个节里存储了到下一个节的指针。由于不必按照顺序存储,在插入的时候可以达到O(1)的复杂度,比我们学习的最基本的线性要快得多。 但是在查找一个节,或者访问特定编号的则需要O(N)的时间。使用构可以克服数组需要预先知道数据大小的缺构可以充分利用计算机内存空间,实现灵活的内存动态管理。 但是失去了数组随机读取的有,同时由于增加了指针域,空间开销较大。不过这在算法与数据构领域是很常见的,用空间换时间,毕竟鱼和熊掌不可兼得。 我的数据构是使用C语言来实现的,那么下面来看一下的头文件定义了哪些操作。

    71830

    ----在中添加元素详解--使用的虚拟头

    在上一小节中关于在中头部添加元素与在其他位置添加元素在逻辑上有所差别,这是由于我们在给添加元素时需要找到待添加元素位置的前一个元素所在的位置,但对于头来说,没有前置节,因此在逻辑上就特殊一些 )--虚拟头此时构为:? 下面对代码进行改写:(1)将之前对头的定义改为对虚拟头的定义将原来定义的头代码private Node head;改为private Node dummyHead;(2)构造函数初始化时对虚拟节进行初始化将原来对头的初始化无参数构造函数 (空时存在一个唯一的虚拟头) 无参数构造函数 public LinkedList() { dummyHead = new Node(null, null); size = 0; }(3)改进之前的 add(int index,E e)方法,之前对在头添加元素单独做了处理(if-else判断),如下: 1 在的index(0--based)的位置添加新的元素e (实际不常用,练习用) 2 3

    19520

    在O(1)时间删除

    题目:给定的头指针和一个指针,在O(1)时间删除该。 例如,当我们往一个空中插入一个时,新插入的就是的头指针。由于此时会改动头指针,因此必须把pHead参数设为指向指针的指针,否则出了这个函数pHead仍然是一个空指针。 在中删除一个,最常规的做法是从的头开始,顺序查找要删除的,找到之后再删除。由于需要顺序查找,时间复杂度自然就是O(n) 了。 上面的思路还有一个问题:如果删除的位于的尾部,没有下一个,怎么办?我们仍然从的头开始,顺便遍历得到给定的前序,并完成删除操作。 最后需要注意的是,如果中只有一个,而我们又要删除的头,此时我们在删除后,还需要把的头设置为NULL。

    26980

    Day56:删除中重复的

    剑指Offer_编程题——删除中重复的题目描述: 在一个排序的中,存在重复的,请删除该中重复的,重复的不保留,返回头指针。 ,因此我们创建一个新的节为了防止第一是重复的元素并且连上原来的,遍历原来的元素进行删除。 如果有重复的那么就保存第一节值,然后进行全部删除。如果不是重复正常遍历。之后返回新的的头。这里需要我们特别注意的是:不仅要删除重复的节,就连本节也一起删除。 如果在牛客网中,此代码可以通过,因为在牛客网中已经为我们定义了构,但是在本地编译器中我们还需要定义构才能正常运行,具体用Java定义构实现如下:public static class 思路二:   由于题目已经告诉我们该是排序;因此在相同元素的在逻辑上是相邻的。我们可以定义一个先驱dummyHead和相连 null->1->2->3->3->4->4->5。

    14231

    Day14:中倒数第k个

    剑指Offer_编程题——中倒数第k个题目描述: 输入一个,输出该的倒数第k个。 具体要求: 时间限制: CC++ 1秒,其他语言2秒 空间限制: CC++32M,其他语言64M 具体思路:思路一:   我们需要遍历出的长度,然后遍历出我们需要的倒数第k个,这是我们常规的想法 ,当然也考虑了代码的鲁棒性和空指针,k为0,k应该大于的长度。 总  本道题主要通过输入考察的输出,最基本的方法就是遍历出的长度,然后遍历出你所需要的倒数第K个节

    13251

    LeetCode题解—求的中间

    题目:求的中间给定一个头为 head 的非空单,返回的中间。如果有两个中间,则返回第二个中间。 示例 1:输入: 输出:此列中的 3(序列化形式:) 返回的值为 3 。 (测评系统对该序列化述是 )。 去除常量,时间复杂度为O(n)空间复杂度只用到单独的一个,空间复杂度为O(1)解法二还记得上一篇我们说到的找到尾第n个算法题吗?其中用到了一个叫做快慢指针的解法。在这里依然可以用到。 slow 1 2 3 4 5 6 fast 1 3 5 7 9 11 上面的例子就是快慢指针会走到的节数:如果为奇数,比如,那么刚好快慢就会走到3和5。 所以我们完全可以将转化成数组,然后一句代码就可以输出中间数了,你可以动手试试哦。这种解法的时间复杂度和空间复杂度又是多少呢?

    11910

    数据C#版笔记--单(LinkList)

    构正好相反,先来看下构:每个元素至少具有二个属性:data和next。data用来存放数据,而next用来指出它后面的元素是谁(有“指针”的意思)。 中的元素,通常也称为节Node,下面是泛型版本的Node.csnamespace 线性{ public class Node { private T data; private Node next 中需要有一个Head节做为开始,这跟顺序有所不同,下面是单的实现:using System;using System.Text; namespace 线性{ public class LinkList 可以看到:在元素插入删除时,无需对后面的元素进行移动,只需要修改自身以及相邻节的next指向即可,所以插入删除元素的开销要比顺序小得多。 最后指出:可以给节再添加一个prev元素,用于指出前一个节是谁,即同时有next和prev二个指向,这种改进后的称为“双向”,它有助于某些情况下减少遍历循环的次数,本文中的这种仅有一个next

    69370

    扫码关注云+社区

    领取腾讯云代金券