昨天转载了篇关于递归算法的解读文,很佩服可以透彻掌握算法又能信手拈来做讲解。反思之前我刷题的记录,像是记流水账、没太多营养,所以希望有时间的话能继续深挖下算法,也能加深自己的理解。
你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
今天早上来公司比较早,就用python写了写数据结构的代码,工作之后虽然参与了一部分开发的工作,但都是在写业务逻辑,时间长了,发现自己成了if-else选手了,索性后面每天都写写,保持保持手感,最近在<极客时间>买了一个<Python核心技术与实战>,感觉也讲得不错,推荐大家看看。
翻转链表一直都是热门题目,笔者就在某大型互联网公司的面试题中碰到过这种题目,这种题目很常常见,相对应的变形和扩展也很多,今天我们就来攻克它吧。
单链表反转是面试中常考的一道题,这道题看起来简单,但是能一遍写出 bug free 的代码相当不容易,本文主要提供递归和迭代两种解题方法,供大家参考。
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
https://leetcode-cn.com/problems/reverse-linked-list/
给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…
---- 【题目】反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明: 1 ≤ m ≤ n ≤ 链表长度。示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 【思路】本题相较于【T104-翻转链表】,增加两项内容:一是需要找到要翻转的节点,二是需要保存链表左侧最后一个非翻转节点,用于修改指针。【代码】python版本# Definition for singly-linked list. # class ListN
排序数组,很明显二分查找,找到第一个 >= k 的元素索引以及第一个 > k 的元素索引,两者相减即为答案,即 lowerBound - upperBound。时间复杂度为 O(logn),空间复杂度为 O(1)。
和【T108-重排链表】类似,将链表分为前后两部分,再将后半部分翻转,最后依次对比两个小链表的元素大小即可。
我知道各位是被标题吸引进来的,那就不废话,先说几个算法笔试的硬核套路,再说说语言选择和做题复习的策略。
这是本公号的第127篇原创。 近期看到一个数据结构题目,翻转链表。动手写了下代码,手生了不少,发现好铁不用也会生锈,大脑也如此。 于是就整体回顾了一下链表的常见操作和数据结构题,整理下分享出来,万一对读者有帮助呢?想必那是极好的!目录如下~
我知道各位是被标题吸引进来的,那就不废话,先说几个算法笔试的硬核套路,再说说语言选择和做题复习的策略。 避实就虚 大家也知道,大部分笔试题目都需要你自己来处理输入数据,然后让程序打印输出。判题的底层原理是,把你程序的输出用 Linux 重定向符 > 写到文件里面,然后比较你的输出和正确答案是否相同。 那么有的问题难点就变得形同虚设,我们可以偷工减料,举个简化的例子,假设题目说给你输入一串用空格分隔的字符,告诉你这代表一个单链表,请你把这个单链表翻转,并且强调,一定要把输入的数字转化成单链表之后再翻转哦! 那
---- 【题目】翻转一个链表例如: 输入: 1->2->3->4->5->null 输出: 5->4->3->2->1->null 【思路】如果只使用两个指针p和q指向前后两个节点,当翻转时(q->next指向p),链表断了,无法继续。我们使用三个指针p、q、r,分别指向前后相邻的三个节点,进行交换时,首先改变r的指向:r = q->next;再翻转q->next = p;接着p和q后移,p = q, q = r。在最后,记得修改head->next以及head的指向。【代码】python版本# Def
====================================================
如果说数据结构是算法的基础,那么数组和链表就是数据结构的基础。因为像堆,栈,树,图等比较复杂的数组结基本上都可以由数组和链表来表示,所以掌握数组和链表的基本操作十分重要。
题目汇总 以下链接均为我博客内对应博文,有解题思路和代码,不定时更新补充。 目前范围:Leetcode前150题 单链表 Reverse Linked List/Reverse Linked List II 翻转链表(必考) Add Two Numbers 给定两个链表分别代表两个非负整数。数位以倒序存储,并且每一个节点包含一位数字。将两个数字相加并以链表形式返回。 Remove Nth Node From End of List 删除链表中倒数第n个节点 Merge Two Sorted
你可以设计一个只使用常数额外空间的算法来解决此问题吗? 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
本文是最近写的两篇链表的整合版,为方便大家查阅,所以整合了一下,也对原有文章中逻辑上的一些错误作了修正,虽说只是整合,也做了不少排版上的工作,如有帮助,欢迎转发+在看^_^。
你可以设计一个只使用常数额外空间的算法来解决此问题吗? 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例 1:
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
今天是LeetCode专题的第58篇文章,我们一起来看看LeetCode 92题,翻转链表II(Reverse LInked List II)。
链接:25. K 个一组翻转链表 - 力扣(LeetCode) (leetcode-cn.com)
https://leetcode-cn.com/problems/reverse-linked-list-ii/
算法思路相同,都是使用dummy节点和cur指针,两两交换链表节点,并返回dummy.next作为结果。
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。
奇偶链表 翻转链表 谷歌刷题打卡03-链表插入排序 奇偶链表代码 class Solution { public: /** 第一次观察: case1特点 01: 头节点保持不变 输入前是1 ,输入后还是1 02: 通过1节点找到2节点,奇数 就是1节点后面追加 最后一个节点就是2 3——>2 ,5 ->2. 特点:都是在2前面,但是2位置并没有发生变化 03:总结:链表特点:翻转后 节点 1 和节点 2位置都没有发生变化。移动是指针。
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;
题目理解起来很简单,判断是否为回文,如果单纯判断一个字符串或者数组是不是回文很容易。但是题目中的链表为单链表,指针只能后移不能前移。所以我们判断起来会比较困难。而且这个题目若是想到了巧妙的方法,但是编码实现阶段或许仍会有些困难。
本题给出的数据结构是单向链表,那么链表中的每个节点ListNode只有2个变量,即:
好久写的一篇文章了,最近也都没有发文章,不过刚刚翻阅草稿文章,觉得这篇文章可以发出来吊打一下曾经的自己,哈哈,毕竟那个时候会的技术真的不够,嘿嘿,略微反思一下过去的自己,谁又不是从过去的自我认知中慢慢认清自己,认清现实呢?那么就来回忆回忆一下链表翻转这个题了,略微怀念那个惦着书去往课堂上课的我,下面看下如何Stack栈这种数据结构实现链表数据翻转的。
给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null
翻转链表也是很经典的链表相关题目,属于必须掌握的。需要声明两个指针,分别指向前驱节点和当前节点,而翻转链表的核心就是当前节点的next指向的变化。
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
这是 LeetCode 上的 「25. K 个一组翻转链表」 ,难度为 「困难」。
题意 翻转链表中第m个节点到第n个节点的部分 注意事项:m,n满足 1 ≤ m ≤ n ≤ 链表长度 样例 给出链表 1->2->3->4->5->null, m = 2 和 n = 4,返回 1->4->3->2->5->null 思路 本题类似于 翻转链表,只不过是限定了翻转的个数而已。 可以先记录下 m 节点的前一个节点,与 n 节点的后一个节点,然后将 m - n 进行翻转(参考:翻转链表 ),最后利用 m 的前节点和 n 的后节点,将链表再次链接起来即可。 代码 /** * Defini
欢迎和小詹一起定期刷leetcode,每周一和周五更新一题,每一题都吃透,欢迎一题多解,寻找最优解!这个记录帖哪怕只有一个读者,小詹也会坚持刷下去的!
关于链表的反转,很多资料讲解不够清晰,参考“无鞋童鞋”原文:https://blog.csdn.net/fx677588/article/details/72357389
参考: https://shenjie1993.gitbooks.io/leetcode-python/025%20Reverse%20Nodes%20in%20k-Group.html A->B->C->D->E,现在我们要翻转BCD三个节点。进行以下几步: 1.C->B 2.D->C 3.B->E 4.A->D 5.返回及节点B
Given a singly linked list, determine if it is a palindrome.
前言 链表的特点 适合 插入和 删除 一个元素,不需要整体移动。 go代码 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } 86. 分隔链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔 你应当 保留 两个分区中每个节点的初始相对位置。 */ func partition(head *ListNode
做有关链表的题目,有个常用技巧:添加一个虚拟头结点(哨兵),帮助简化边界情况的判断。
必看: http://blog.csdn.net/autumn20080101/article/details/7607148 以下代码若理解不通请务必务必务必务必务必务必务必看上方网页
无论是插入,删除,还是翻转等等操作,先把 next 指针用临时变量保存起来,这可以解决 90% 重组链表中指向出错的问题,
领取专属 10元无门槛券
手把手带您无忧上云