首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据结构-链表

从结构上来看,双向链表可以支持 O(1) 时间复杂度的情况下找到前驱结点,正是这样的特点,也使双向链表在某些情况下的插入、删除等操作都要比单链表简单、高效。...【可选 循环链表、双向链表】,支持增删操作 单链表反转链 表中环的检测 两个有序的链表合并 删除链表倒数第 n 个结点 求链表的中间结点 思考题:基于链表的 LRU 算法 LRU 思路一 如果此数据之前已经被缓存在链表中了...如果此数据没有在缓存链表中,又可以分为两种情况: 如果此时缓存未满,则将此结点直接插入到链表的头部; 如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。...代码片段 // 判断是否为回文 public boolean palindrome() { // 根据快慢指针找到中间节点, 但是不知道总结点个数是奇还是偶数...https://time.geekbang.org/column/article/41013 07 | 链表(下):如何轻松写出正确的链表代码?

42310

数据结构链表结构

从结构上来看,双向链表可以支持 O(1) 时间复杂度的情况下找到前驱结点,正是这样的特点,也使双向链表在某些情况下的插入、删除等操作都要比单链表简单、高效。...头结点即为第一个节点undefined 尾节点指向空地址 带哨兵的节点有利于简化代码,推荐使用 双向链表 循环链表是一种特殊的单链表。实际上,循环链表也很简单。它跟单链表唯一的区别就在尾结点。...【可选 循环链表、双向链表】,支持增删操作 单链表反转链 表中环的检测 两个有序的链表合并 删除链表倒数第 n 个结点 求链表的中间结点 思考题:基于链表的 LRU 算法 LRU 思路一 如果此数据之前已经被缓存在链表中了...如果此数据没有在缓存链表中,又可以分为两种情况:undefined如果此时缓存未满,则将此结点直接插入到链表的头部;undefined如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。...代码片段 // 判断是否为回文 public boolean palindrome() { // 根据快慢指针找到中间节点, 但是不知道总结点个数是奇还是偶数

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

    【初阶数据结构篇】链表与顺序表的智慧碰撞:算法难题中的进阶之路

    假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。...考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过: 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。...和合并数组大致思路相同 可以在创建新链表的一开始申请头结点(哨兵位),避免对于newtail和newhead为空的情况进行讨论 记得最后释放空间!!!...有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针 解题思路:创建两个链表,分别存放小于...保证链表长度小于等于900 不推荐的解法,类似数组字符串的回文解法 先把链表中的元素值全部保存到数组中,然后再判断数组是否为回文。

    8010

    数据结构-链表

    从结构上来看,双向链表可以支持 O(1) 时间复杂度的情况下找到前驱结点,正是这样的特点,也使双向链表在某些情况下的插入、删除等操作都要比单链表简单、高效。...【可选 循环链表、双向链表】,支持增删操作 单链表反转链 表中环的检测 两个有序的链表合并 删除链表倒数第 n 个结点 求链表的中间结点 思考题:基于链表的 LRU 算法 LRU 思路一 如果此数据之前已经被缓存在链表中了...如果此数据没有在缓存链表中,又可以分为两种情况:undefined如果此时缓存未满,则将此结点直接插入到链表的头部;undefined如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。...然后分别拿到两端的 head 指针就行循环,如果遇到节点的数据不一致则认定不是回文串。若循环结束则认为该串是回文串。...代码片段 // 判断是否为回文 public boolean palindrome() { // 根据快慢指针找到中间节点, 但是不知道总结点个数是奇还是偶数

    40810

    BAT算法面试题(12)--环形链表(哈希表法)

    面试题目 给定一个链表,判断链表中是否有环. 难度升级: 试试能否在不使用额外空间解决此问题?...算法 我们遍历所有的节点并在哈希表中存储每个结点的引用(或内存地址).如果当前节点为空结点null,表示我们已经检测到链表的末尾的下一个节点.那么表示我们已经完成了链表的遍历,并且此链表不是环形链表.如果当前结点的引用已经存在过哈希表中...,那么即可立马返回true(表示此链表为环形链表)....代码 Java Code 复杂度分析 时间复杂度: O(n),对于含有n个元素的链表,我们访问每个元素最多一次.添加一个结点到哈希表中只需要花费O(1)的时间....(方法一) BAT面试算法进阶(6)- BAT面试算法进阶(6)-最长回文子串(方法二) BAT面试算法进阶(7)- 反转整数 BAT面试算法进阶(8)- 删除排序数组中的重复项 BAT面试算法进阶(

    33430

    判断回文字符串、回文链表、回文数(python实现)

    思路 我们需要找到链表中点(快慢指针法) 将链表后半段倒置逆序排序 将前半段和后半段遍历比较,判断是否为回文链表,偶数情况,使用偶数定位中点策略,要确定是返回上中位数或下中位数 注意事项: 快慢指针定位中点时要区分奇偶情况...让我们看看如何将这个想法转化为一个算法。 算法 首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。...代码 class Solution(object): def is_palindrome(self, num: int) -> bool: # 当 x 回文数...# 如果数字的最后一位是 0,为了使该数字为回文,则其第一位数字也应该是 0 # 只有 0 满足这一属性 if num 在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123, # 由于处于中位的数字不影响回文(它总是与自己相等)

    2.2K20

    代码面试

    处理循环链表或数组时,此方法非常有用。 通过以不同的速度移动(例如,在循环链表中),该算法证明两个指针必然会合。一旦两个指针都处于循环循环中,快速指针应捕获慢速指针。...您如何确定何时使用快速和慢速模式? 该问题将处理链表或数组中的循环 当您需要知道某个元素的位置或链表的总长度时。 什么时候应该在上面提到的“两指针”方法上使用它?...在某些情况下,您不应该使用“两指针”方法,例如在单链列表中,您不能向后移动。何时使用快速和慢速模式的一个示例是当您试图确定链接列表是否为回文式时。...合并间隔问题模式: 区间相交(中) 最大CPU负载(硬) 模式五:循环排序 此模式描述了一种有趣的方法来处理涉及包含给定范围内的数字的数组的问题。...如何确定何时使用此模式: 如果要求您在不使用额外内存的情况下反向链接列表 链表模式就地反转的问题: 撤消子列表(中) 反转每个K元素子列表(中) 模式七:树的宽度优先搜索 此模式基于广度优先搜索(BFS

    1.8K31

    .NET面试题系列 - IEnumerable的派生类

    Pop 操作会返回栈顶的数据项,但是此操作也会把此数据项从堆栈中移除。如果只是希望察看栈顶的数据项而不是真的要移除它,在 C#语言中有一种名为 Peek(取数)的操作可以实现。...如果在任何时候发现两个字符不相同,那么此字符串就不是回文,同 时就此终止程序。如果比较始终都相同,那么此字符串就是回文。 程序实现很简单,代码留作练习。...默认情况下,Queue的初始化容量是32,也可以通过构造函数指定容量。 Enqueue方法会判断 Queue中是否有足够容量存放新元素。如果有,则直接添加元素,并使索引tail递增。...但其并不是链表。它的内部实现是数组。靠链表实现的数据结构是LinkedList。 List 在大多数情况下,这都是默认的列表选择。List内部是由数组来实现的。...如何选择数据结构 在不同情况时选择恰当的数据结构,将会提升程序的性能。

    1.7K20

    【Java数据结构】详解LinkedList与链表(二)

    6.链表分割 现有一链表的头引用 pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。...判定链表的回文结构 解题思路实现: 1.找到链表的中间节点,找中间节点:采用快慢指针就行了 2.对链表的后半部分进行反转 3.将两个链表从前往后逐个节点进行比对,如果比对之后发现所有节点的值域都相同...下面是两个节点相交的各类情况: 从上述链表相交的情况看出,两个单链表只要相交,从交点开始,到其后续所有的节点都是两个链表中公共的节点 检测两个链表是否相交:分别找到两个链表中的最后一个节点,然后检测这两个节点的地址是否相同即可...所以我们在环问题中设置快慢指针,都是将快指针设置为一次两步,慢指针一次一步,这样当存在圈时无论如何都会相遇。...……,n的大小取决于环的大小,环越小n越大) 极端情况下,假设n=1,此时:L=R-X 所以由此得知一个指针从链表起始位置运行,一个指针从相遇点位置绕环,每次都走一步,两个指针无论如何最终都会在入口点的位置相遇

    7810

    【CPP】《程序员面试金典》习题(2)——链表

    代码和其他一些LeetCode代码我保存在了https://github.com/ZFhuang/LeetCodes 02.01 移除重复节点【简单】 编写代码,移除未排序链表中的重复节点。...如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。...从各自的表头开始算起,链表 A 为 [4,1,8,4,5], 链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点; 在 B 中,相交节点前有 3 个节点。...从各自的表头开始算起,链表 A 为 [0,9,1,2,4], 链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点; 在 B 中,相交节点前有 1 个节点。...有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。

    52720

    LeetCode HOT 100 之总结记录

    使用中心扩散法,使每个字符都充当回文串的中心 此时就需要分情况讨论,中心为1个数还是2个,即回文串为奇数还是偶数;若当前访问字符满足回文串条件(在s中且相同),则继续向外扩散,直到不满足条件 /**...,寻找其他出路,再次走到黑,再次回退,直到走遍所有路 回溯函数中需要指定走到的层数以及在这个过程中一直被修改和引用的变量;在回溯函数开头还需要添加判断是否走到尽头的函数:如果是,则做一些操作、返回;如果不是...子数组 是数组中的一个连续部分 :star:动态规划 因为我们需要的是最大和的连续子数组,我们无法确定最大的连续子数组会包含哪些数,所以我们需要求出每个数被包含时的最大子数组 又因为无法确定当前查询的数在包含它的最大子数组中的位置...环形链表 给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。如果链表中存在环 ,则返回 true 。...回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

    39740

    如何高效判断回文单链表?

    预计阅读时间:7 分钟 今天聊聊如何判断一个链表是不是回文链表。...下面扩展这一最简单的情况,来解决:如何判断一个「单链表」是不是回文。...一、判断回文单链表 输入一个单链表的头结点,判断这个链表中的数字是不是回文: /** * 单链表节点的定义: * public class ListNode { * int val; *...traverse(root.right); // 后序遍历代码 } 在 学习数据结构的框架思维 中说过,链表兼具递归结构,树结构不过是链表的衍生。...如果我想正序打印链表中的val值,可以在前序遍历位置写代码;反之,如果想倒序遍历链表,就可以在后序遍历位置操作: /* 倒序打印单链表中的元素值 */ void traverse(ListNode head

    91610

    LeetCode-234-回文链表

    # LeetCode-234-回文链表 请判断一个链表是否为回文链表。...# 解题思路 方法1、快慢指针+反转链表: 先通过快慢指针找到链表中点 奇偶情况不同,奇数情况应该跳过中心节点,偶数情况中心节点为2个,需要翻转的的位置仍然是slow.next开始 之后进行后半部分的链表反转...由于栈有先进后出的特点,所以只需要再一次遍历链表将栈顶的值和链表中的值进行比较,这样做等价于栈维护了一个逆序链表,所谓回文的意思就是逆序链表和正序链表相同,如果遍历的过程中出现值不相等,那么证明该链表不是回文链表...,反之则是回文链表。...当然这并不是最优解,因为消耗了O(n)的空间,也遍历了2次链表 # Java代码 /** * Definition for singly-linked list.

    22230

    备战蓝桥杯————双指针技巧巧解数组3

    删除有序数组中的重复项: 给定一个有序数组,原地删除重复出现的元素,使每个元素只出现一次,并返回新的长度。利用双指针技巧,一个指针用于遍历数组,另一个指针指向新数组的末尾。...最长回文子串: 找到给定字符串中的最长回文子串。作者通过介绍中心扩散法,结合双指针技巧,在遍历过程中寻找回文子串的中心点。...删除排序链表中的重复元素: 删除排序链表中重复的元素,使得每个元素只出现一次。...对于相邻字符 s[i] 和 s[i+1],以它们为中心,利用 Pame(s, i, i+1) 寻找长度为偶数的回文串。 在每次扩展中,更新最长回文串的长度和起始位置。...函数 Pame(s, l, r) 的作用是在给定字符串 s 中,以指定的左右指针 l 和 r 为中心,向两端扩展,寻找回文串。这个函数的具体实现应该考虑到奇数长度和偶数长度的情况。

    13910

    数组双指针直接秒杀七道题目

    双指针技巧在处理数组和链表相关问题时经常用到,主要分为两类:左右指针和快慢指针。 所谓左右指针,就是两个指针相向而行或者相背而行;而所谓快慢指针,就是两个指针同向而行,一快一慢。...」,如果给你一个有序的单链表,如何去重呢?...题目让我们将所有 0 移到最后,其实就相当于移除nums中的所有 0,然后再把后面的元素都赋值为 0 即可。...所以我们可以先实现这样一个函数: // 在 s 中寻找以 s[l] 和 s[r] 为中心的最长回文串 String palindrome(String s, int l, int r) { //...不过这种情况也就回文串这类问题会遇到,所以我也把它归为左右指针了。 到这里,数组相关的双指针技巧就全部讲完了,希望大家以后遇到类似的算法问题时能够活学活用,举一反三。

    52610

    Leetcode编程练习

    所以,当遍历完数组后,x 中存储的是从0到N-1的所有整数与数组 nums 中实际存在的整数的异或结果。 第二个for循环: 这个循环从0开始,到N(包括N)结束,与 x 进行异或运算。...理想情况下,如果数组 nums 是完整的,即包含从0到N-1的所有整数,那么在这个循环结束后,x 的值应该是0(因为所有数字都异或了自己,结果为0)。...(除非该数字也是 N,但这种情况不可能发生,因为数组中不可能有 N 这个元素)。...这种方法的关键在于理解如何通过反转操作来重新排列数组中的元素。它避免了使用额外的空间,并且时间复杂度为 O(n),其中 n 是数组的长度。...当两个指针在两个链表中遍历时,它们会同时移动相同的步数。这样,当它们到达交点时,它们就会处于相同的位置,即使两个链表的长度不同。

    9810

    【灵魂 | 数据结构与算法】线性表(数组&链表)原理详解 + 实战代码

    此外还要警惕数据越界问题,很多计算机病毒也正是利用到了代码中的数组越界可以访问非法地址的漏洞,来攻击系统,所以写代码的时候一定要警惕数组越界。...数组越界在 C 语言中是一种未决行为,并没有规定数组访问越界时编译器应该如何处理。因为,访问数组的本质就是访问一段连续内存,只要数组通过偏移计算得到的内存地址是可用的,那么程序就可能不会报任何错误。...为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。如图所示,我们把这个记录下个结点地址的指针叫作后继指针next。...数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。...代码要写好链表有以下几点: 了解理解指针或引用的含义(地址调用) 警惕指针丢失和内存泄漏:特别是在删除操作中,避免丢失和未释放资源 利用哨兵机制简化链表代码 LCR 018.

    25210

    如何判断回文链表

    下面扩展这一最简单的情况,来解决:如何判断一个「单链表」是不是回文。...一、判断回文单链表 输入一个单链表的头结点,判断这个链表中的数字是不是回文: /** * 单链表节点的定义: type ListNode struct { val int next...那么最简单的办法就是,把原始链表反转存入一条新的链表,然后比较这两条链表是否相同。关于如何反转链表,可以参见前文「递归操作链表」。...traverse(root.right) // 后序遍历代码 } 在「学习数据结构的框架思维」中说过,链表兼具递归结构,树结构不过是链表的衍生。...如果我想正序打印链表中的val值,可以在前序遍历位置写代码;反之,如果想倒序遍历链表,就可以在后序遍历位置操作: func traverse3(head *ListNode) { if head

    89720

    LeetCode通关:听说链表是门槛,这就抬脚跨门而入

    所以链表在内存中是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。 ? 链表的定义 链表的定义主要包含两个部分:数据域和指针域。...如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。...在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。 addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。...注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。 说明:不允许修改给定的链表。 进阶: 你是否可以使用 O(1) 空间解决此题? ? 思路: 这道题,乍一看,是 141....,合并这两个链表并使新链表中的节点仍然是递增排序的。

    43820
    领券