
链表
Betternw
这个作者很懒,什么都没留下…
展开
-
206反转链表、奇偶重排、重排链表
题目反转一个单链表分析动画演示指针逆序实际上需要两个指针,原本的后指向原本的前,但是在每一次指向的时候都需要一个指针保存第三个。否则无法移动。代码原创 2020-06-02 20:41:16 · 278 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)分析两个指针分别遍历。让a+b作为链表A的新长度,b+a作为链表B的新长度。代码class Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode *ta = pHead1, *tb = pHe原创 2021-08-01 15:34:08 · 109 阅读 · 0 评论 -
24 两两交换链表中的节点
题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]分析递归解法:返回值:交换完成的子链表调用单元:设需要交换的两个点为 head 和 next,head 连接后面交换完成的子链表,next 连接 head,完成交换终止条件:head 为空指针或者 next 为空指针,也就是当前无节点或者只有原创 2021-07-22 16:45:16 · 107 阅读 · 0 评论 -
92 反转链表2
题目描述给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]示例 2:输入:head = [5], left = 1, right = 1输出:[5]分析两个指针遍历到中间部分,将中间部分反转,再进行连接。代码 public L原创 2021-07-22 09:59:14 · 93 阅读 · 0 评论 -
82 删除排序链表中的重复元素
题目描述存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3]输出:[2,3]分析记得要循环判断到没有重复的元素未知,否则next指针需要一直后移代码 public ListNode deleteDuplicates(ListNode h原创 2021-07-21 20:26:42 · 93 阅读 · 0 评论 -
【记录进位值】2两数相加
题目给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807分析每一位的计算需要考虑上一位的进位问题,当前位计算完后也要更新进位值。如果两个链表全部遍历完毕,进位值为1,那么要添加节点1 。原创 2020-06-09 11:04:28 · 322 阅读 · 0 评论 -
【双指针 快慢指针】19 删除链表倒数第N个元素
题目给定一个链表,删除链表的倒数第n个节点,并且返回头结点分析两次遍历:首先第一次遍历的得到长度。第二次遍历时,因为删除节点需要有被删除节点的前一个节点。考虑到只有一个节点、两个节点的情况这种极端情况。需要定义一个head前指针代码ListNode p1 = head;int len=0;while(p1!=null){ len++; p1 = p1.next;}int rem = len-n;/*因为删除节点需要有被删除节点的前一个节点。考虑到只有一个节点、两个节点原创 2020-06-04 00:41:28 · 189 阅读 · 0 评论 -
【堆 优先队列 分而治之】 23 合并k个有序链表
题目合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6思路优先级队列的原理是堆。如果不重写比较器,那么就将放入的元素按照升序排序并输出。此题重新定义比较器,将传入的值按照val值的大小进行排序。for循环将数组中每个链表的第一个节点放入队列中,并且会进行大小值的排序。p连接弹出的最小值原创 2020-06-20 10:36:30 · 197 阅读 · 0 评论 -
【新建链表】 86分隔链表
题目给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5思路建立两个链表,一个连接比x小的节点,一个连接比x大的节点,最后将这两个链表连接起来代码public ListNode partition(ListNode head, int x) { ListNode minh原创 2020-07-02 09:59:46 · 74 阅读 · 0 评论 -
【dfs 中序】 offer36 二叉搜索树与双向链表
题目将一个二叉搜索树转换成循环双向链表思路二叉搜索树按中序遍历出就是升序序列,再标注一个前驱节点就可以进行链表的连接。代码Node pre,head;public Node treeToDoublyList(Node root) { if(root==null) return null; dfs(root); //得到头尾结点,将头尾连接 head.left = pre; pre.right = head; return head;}publ原创 2020-07-02 11:10:51 · 83 阅读 · 0 评论 -
83 删除排序链表中的重复元素
题目给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。输入: 1->1->2输出: 1->2输入: 1->1->2->3->3输出: 1->2->3代码public ListNode deleteDuplicates(ListNode head) { ListNode cur = head; while(cur!=null&&cur.next!=null){ if(cur.val原创 2020-07-03 17:26:05 · 86 阅读 · 0 评论 -
【栈】 offer06 从尾到头打印链表
题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)输入:head = [1,3,2]输出:[2,3,1]代码public int[] reversePrint(ListNode head) { Deque<Integer> stack = new LinkedList<>(); //记着头结点不能随意移动,要用其他变量代表头结点 ListNode cur = head; while(cur!=null){原创 2020-07-04 15:13:06 · 90 阅读 · 0 评论 -
【双指针追击问题】 offer22 链表中的倒数第K个节点
题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。代码 public ListNode getKthFromEnd(ListNode head, int k) { ListNode left = head; ListNode right = head; //right原创 2020-07-05 20:16:58 · 152 阅读 · 0 评论 -
offer 18 删除链表的节点
题目给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。输入: head = [4,5,1,9], val = 5输出: [4,1,9]思路双指针遍历代码public ListNode deleteNode(ListNode head, int val) { if(head.val==val) return head.next; ListNode cur = head; ListNode bef = cur.next; while(bef!=nu原创 2020-07-05 19:12:52 · 91 阅读 · 0 评论 -
【快慢指针/栈】234 回文链表
题目描述判断一个链表是否为回文链表分析使用空间为n:将链表整个压入栈。然后栈元素弹出。挨个比较元素是否相同。使用空间为n/2:快慢指针。快指针一次两步慢指针一次一步。快指针到达结尾时,慢指针到达中间,中间部分之后压入栈。然后栈弹出元素,与前半部分相比较。不使用额外空间:快慢指针。快指针一次两步慢指针一次一步。快指针到达结尾时,慢指针到达中间。然后将后半部分链表逆序。两个指针分别从头尾出发,进行元素比较。最后要将后半部分再还原回来。代码...原创 2020-05-29 21:14:21 · 174 阅读 · 0 评论 -
【双指针,】160 相交链表
题目描述编写一个程序找到两个单链表相交的起始节点分析求出两个链表的长度。当尾指针不相等时必不相交。让长链表指针先走一段长度之差,然后两个链表指针一起走,当相等时即为相交指针。当两个节点相等时,值和next指针一定都是相等的。所以不会存在123456和123546这种情况。代码...原创 2020-06-02 18:00:56 · 127 阅读 · 0 评论 -
【快慢指针,分治合并 归并排序,合并链表】148 排序链表
题目在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。分析归并排序+合并链表的思路首先使用快慢指针+递归将链表拆为多个子链表,然后使用合并链表的思路将每个子链表两两排序连接起来。最后返回链表头代码public class ListNode{ int val; ListNode next; public ListNode(int data) { this.val = data; }}public ListNode so原创 2020-06-02 23:39:20 · 157 阅读 · 0 评论 -
【哈希链表】 146 LRU、LFU缓存机制
题目设计LRU机制。支持获取数据get和写入数据put。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。思路构建双向链表,每个节点存储键值对。哈希表中相应存储。读取时:如果有,就取出放在头部位置。(取出放在头部位置可原创 2020-06-13 16:47:55 · 206 阅读 · 0 评论 -
【快慢指针 先判断是否有环 然后寻找入环点】 142 环形链表
题目给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。分析快慢指针,快指针一次两步慢指针一次一步。当快指针走到空时证明无环。如果有环,快慢指针必相遇。相遇后快指针回到起点,和慢指针一起走,再次相遇时为入口。环外链表的长度 = 第一次相遇点 + n-1次环的长度(公式推导)代码public class ListNode{ int val; ListNode next; public ListNode(int dat原创 2020-06-03 23:24:29 · 174 阅读 · 0 评论 -
【快慢指针 不同起点 快两步慢一步 相遇停止】141 环形链表 环形链表的约瑟夫问题
题目给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。分析快慢指针,快指针一次两步慢指针一次一步。当快指针走到空时证明无环。如果有环,快慢指针必相遇。相遇后快指针回到起点,和慢指针一起走,再次相遇时为入口。公式推导环外链表的长度 = 第一次相遇点 + n-1次环的长度代码public class ListNode{ int val; ListNod原创 2020-06-03 00:51:52 · 264 阅读 · 0 评论 -
[hashmap ] offer35 复杂链表的复制
题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null思路将复制节点连接在分别的原节点后,即1—1’—2–2’–3--3’–4’–4’。 通过1的ran指针找到随机节点,再通过next找到随机节点的拷贝节点,将1’连接拷贝节点。|| 哈希表,k为原指针,v为拷贝指针。1’next指向2’ get获得的是value 也就是拷贝节点,1’rand指向1random指针原创 2020-07-08 09:34:27 · 143 阅读 · 0 评论 -
【快慢指针】61 旋转链表
题目给定一个链表,旋转链表,将链表每个节点向右移动 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代码 public ListNode rotate原创 2020-07-27 09:20:58 · 81 阅读 · 0 评论 -
【递归 分段反转链表,进行连接】 25 K个一组翻转链表
题目给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5思路代码public ListNode reverseKGroup(ListNod原创 2020-07-01 16:27:56 · 150 阅读 · 0 评论 -
21 合并两个升序链表
题目将两个升序链表合并为一个新的升序链表并返回分析定义两个指针。一个是头部指针(-1),一个是从头部指针开始的移动指针。最后返回头部.next代码原创 2020-06-02 21:33:45 · 182 阅读 · 0 评论