常见单链表操作
常见单链表操作
氵冫丶
这个作者很懒,什么都没留下…
展开
-
LRU缓存策略
题目为最近最少使用(LRU)缓存策略设计一个数据结构,它应该支持以下操作:获取数据(get)和写入数据(set)。获取数据get(key):如果缓存中存在key,则获取其数据值(通常是正数),否则返回-1。写入数据set(key, value):如果key还没有在缓存中,则写入其数据值。当缓存达到上限,它应该在写入新数据之前删除最近最少使用的数据用来腾出空闲位置。解题参考链接 1.利用双链表记录顺原创 2016-07-14 19:08:33 · 1981 阅读 · 0 评论 -
链表中环的入口结点
题目一个链表中包含环,请找出该链表的环的入口结点。解题Set这样的太机智 剑指offer上没给证明,在LeetCode上看到讲解,总结如下 我们找到相遇节点C后 指向开始节点和C出的节点一次走一步,相遇就是环起始节点 疑问:为什么要把n设置成1?快慢指针走的环的次数差一定是1时是第一次相遇,合理解释就是方便计算。/* public class ListNode { int va原创 2016-06-25 22:28:29 · 1165 阅读 · 0 评论 -
K组翻转链表
题目给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下。 链表元素个数不是k的倍数,最后剩余的不用翻转。 样例 给出链表 1->2->3->4->5k = 2, 返回 2->1->4->3->5k = 3, 返回 3->2->1->4->5解题同样用到递归的方式 利用k找到需要翻转的部分链表,利用头插法进行翻转 注意当链表长度不足k个的时候不需要翻转,这里我是单独进行判断的。原创 2016-07-14 17:07:03 · 2148 阅读 · 0 评论 -
重排链表
题目给定一个单链表L: L0→L1→…→Ln-1→Ln,重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…必须在不改变节点值的情况下进行原地操作。 样例 给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null。解题当程序不会写的时候考虑递归解决第一个节点head 第二个节点headNext 最后一个节点lastNode 最后一个节点前驱节点las原创 2016-07-14 16:45:04 · 2251 阅读 · 0 评论 -
旋转链表
题目给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数 样例 给出链表1->2->3->4->5->null和k=2返回4->5->1->2->3->null解题找到第k个结点 找到最好一个结点 最后一个结点链接到头结点 第k个结点后面断开/** * Definition for singly-linked list. * public class ListNod原创 2016-07-14 16:14:07 · 1145 阅读 · 0 评论 -
回文链表
题目设计一种方式检查一个链表是否为回文链表。解题回文串的特征就是正反看结果都一样 如:aba、abcsdffdscba 所有翻转链表后比较 但是翻转链表改变了原始链表之间的指针 需要先复制原始链表 复制链表和选择链表进行比较/** * Definition for singly-linked list. * public class ListNode { * int val;原创 2016-07-12 21:14:49 · 1353 阅读 · 0 评论 -
删除排序链表中的重复数字 II
题目给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。 样例 给出 1->2->3->3->4->4->5->null,返回 1->2->5->null给出 1->1->1->2->3->null,返回 2->3->null解题记录相同个数 一个相同的保存,多个的跳过/** * Definition for ListNode * public class ListNode原创 2016-07-12 20:42:26 · 2436 阅读 · 0 评论 -
合并k个排序链表
题目合并k个排序链表,并且返回合并后的排序链表。尝试分析和描述其复杂度。 样例 给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null解题两两合并 合并ab得到c 合并cd得到e/** * Definition for ListNode. * public class ListNode { * int val; * L原创 2016-07-12 16:02:05 · 1924 阅读 · 0 评论 -
排序列表转换为二分查找树
题目给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树解题找到中间点,建立树的根结点 左右半边递归 注意: 右半边链表可以根据找到的中间节点进行递归 左半边要找到结束位置,这里我新建了一个链表/** * Definition for ListNode. * public class ListNode { * int val; * ListNode原创 2016-07-12 09:53:25 · 1131 阅读 · 0 评论 -
链表排序
题目在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。您在真实的面试中是否遇到过这个题? Yes 样例 给出 1->3->2->null,给它排序变成 1->2->3->null.解题尝试快速排序,划分节点不知道怎么找 参考链接 快速排序 找到小于x,找到等于x,找到大于x,三个链表合并 注意: 如果小于x和等于x的在一起考虑,有错误 如:1 3 2 第一次划原创 2016-07-12 09:27:49 · 984 阅读 · 0 评论 -
翻转链表 II
题目翻转链表中第m个节点到第n个节点的部分 注意事项 m,n满足1 ≤ m ≤ n ≤ 链表长度 样例 给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null解题只需要翻转其中一部分 根据结点值进行更新链表 时间复杂度:O(n)O(n) 空间复杂度:O(n)O(n)/** * Definition for ListNo原创 2016-07-11 19:24:01 · 1745 阅读 · 0 评论 -
两个链表的交叉
题目请写一个程序,找到两个单链表最开始的交叉节点。 注意事项 如果两个链表没有交叉,返回null。 在返回结果后,两个链表仍须保持原有的结构。 可假定整个链表结构中没有循环。 样例 下列两个链表: 在节点 c1 开始交叉。解题单链表有交叉一定是上图的形式:两个指针指向同一个结点,之后不在分离。如果分了就出现一个指针指向两个结点的情况,这个时候就不是单链表了。根据上图:先求出两个链原创 2016-07-10 21:43:10 · 1021 阅读 · 0 评论 -
判断带环链表
题目给定一个链表,判断它是否有环。 给出 -21->10->4->5, tail connects to node index 1,返回 true解题两个指针不同步长走,当相遇了说明有环public class Solution { /** * @param head: The first node of linked list. * @return: True if原创 2016-07-10 21:03:19 · 601 阅读 · 0 评论 -
删除链表中倒数第n个节点
题目解题定义两个指针,slow、fast fast先先前走n步后、slow和fast一起走,直到fast到最后一个结点 当fast为空,说明fast在最后一个结点后面了,说明需要删除的是第一个结点,直接删除为了方便删除第一个结点,加入头结点下面slow.next指向的是需要删除的结点,直接删除/** * Definition for ListNode. * public class List原创 2016-07-10 20:54:09 · 2399 阅读 · 0 评论 -
链表求和
题目你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。 样例 给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null解题通过新建结点求和 注意进位情况,特别是最后可能还要进位的/** * Definition for singl原创 2016-07-10 20:43:44 · 694 阅读 · 0 评论 -
链表插入排序
题目用插入排序对链表排序 样例 Given 1->3->2->0->null, return 0->1->2->3->null解题public class Solution { /** * @param head: The first node of linked list. * @return: The head of linked list. */原创 2016-07-09 11:09:23 · 453 阅读 · 0 评论 -
链表划分
题目给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。你应该保留两部分内链表节点原有的相对顺序。 样例 给定链表 1->4->3->2->5->2->null,并且 x=3返回 1->2->2->4->3->5->null解题定义两个链表,一个链接较小的,一个链接较大的,最后链接起来public class Solution { /** * @par原创 2016-07-09 10:26:08 · 1044 阅读 · 0 评论 -
两两交换链表中的节点
题目给一个链表,两两交换其中的节点,然后返回交换后的链表。 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3。解题递归方式 交换p 和 p.next 结点 swapHead = p.next swapHead.next = p/** * Definition for singly-linked list. * public class ListNode {原创 2016-07-09 10:11:14 · 1941 阅读 · 0 评论 -
合并两个排序链表
题目将两个排序链表合并为一个新的排序链表 样例 给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。解题有序链表合并,找到较小的链接起来,指针后移/** * Definition for ListNode. * public class ListNode { * int val; * ListNode原创 2016-07-09 09:38:58 · 402 阅读 · 0 评论 -
删除排序链表中的重复元素
题目给定一个排序链表,删除所有重复的元素每个元素只留下一个。样例 给出 1->1->2->null,返回 1->2->null给出 1->1->2->3->3->null,返回 1->2->3->null解题加一个头结点 链表有序,找到不相等的时候,删除中间结点 两两比较是否相同进行删除/** * Definition for ListNode * public class ListNod原创 2016-07-09 09:05:25 · 415 阅读 · 0 评论 -
翻转链表
题目翻转一个链表 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null解题头插法/** * Definition for ListNode. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { * this.val原创 2016-07-08 22:26:10 · 395 阅读 · 0 评论 -
在O(1)时间复杂度删除链表节点
题目给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。 样例 给定 1->2->3->4,和节点 3,删除 3 之后,链表应该变为 1->2->4。解题通过更改结点值进行删除/** * Definition for ListNode. * public class ListNode { * int val; * ListNod原创 2016-07-08 21:32:38 · 333 阅读 · 0 评论 -
链表倒数第n个节点
题目找到单链表倒数第n个节点,保证链表中节点的最少数量为n。 样例 给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1.解题两个指针slow、fast fast向前走n步后,slow和fast一起走,fast是最后一个结点时候,slow所指的结点就是答案/** * Definition for ListNode. * public class ListNode原创 2016-07-08 21:30:20 · 444 阅读 · 0 评论 -
删除链表中的元素
题目删除链表中等于给定值val的所有节点。 样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。解题原始定义的链表没有头结点,加上头结点进行删除/** * Definition for singly-linked list. * public class ListNode { * int val; *原创 2016-07-08 21:21:43 · 402 阅读 · 0 评论 -
单链表常见操作
存储方法 链接方式存储的线性表简称为链表(Linked List)。 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 注意:原创 2016-07-08 21:17:57 · 529 阅读 · 0 评论