![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构 链表
文章平均质量分 76
温酒知莲华
这个作者很懒,什么都没留下…
展开
-
[LeetCode]237. Delete Node in a Linked List
Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value原创 2017-07-13 07:42:29 · 164 阅读 · 0 评论 -
访问单个节点的删除
实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定带删除的头节点和要删除的数字,请执行删除操作,返回删除后的头结点。链表中没有重复数字/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}};*/class原创 2017-08-30 12:01:52 · 223 阅读 · 0 评论 -
[LintCode]96.链表划分
给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。你应该保留两部分内链表节点原有的相对顺序。样例给定链表 1->4->3->2->5->2->null,并且 x=3返回 1->2->2->4->3->5->null思路:将所有小于等于给定值的节点取出组成一个新的链表a,将所有大于给定值的节点取出组成另一个新的链表b,只要将b链表直接接原创 2017-08-30 14:57:49 · 319 阅读 · 0 评论 -
打印两个链表的公共值
现有两个升序链表,且链表中均无重复元素。请设计一个高效的算法,打印两个链表的公共值部分。给定两个链表的头指针headA和headB,请返回一个vector,元素为两个链表的公共部分。请保证返回数组的升序。两个链表的元素个数均小于等于500。保证一定有公共值测试样例:{1,2,3,4,5,6,7},{2,4,6,8,10}返回:[2.4.6]/*原创 2017-08-30 15:13:00 · 297 阅读 · 0 评论 -
[LintCode]450.K组翻转链表
给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下。链表元素个数不是k的倍数,最后剩余的不用翻转。样例给出链表 1->2->3->4->5k = 2, 返回 2->1->4->3->5k = 3, 返回 3->2->1->4->5思路:从左向右遍历链表,如果栈的大小不等于k,就将结点压入栈中。每当栈的大小达到k时,从栈中依次弹出这些结点,根据弹出的原创 2017-08-30 15:42:21 · 329 阅读 · 0 评论 -
[LintCode]452.删除链表中的元素
删除链表中等于给定值val的所有节点。 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。思路:1.判断head是否为空 2.要删除的节点在头部 3.要删除的节点在中间、尾部,遍历链表删除/** * Definition for sin原创 2017-07-13 09:29:15 · 315 阅读 · 0 评论 -
[LintCode]223.回文链表
设计一种方式检查一个链表是否为回文链表。样例1->2->1 就是一个回文链表。思路:使用栈作为辅助的实现方法。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(原创 2017-08-30 16:09:47 · 270 阅读 · 0 评论 -
[LintCode]105.复制带随机指针的链表
给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。 /** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *原创 2017-08-18 11:01:31 · 243 阅读 · 0 评论 -
[LintCode]102.带环链表
给定一个链表,判断它是否有环。样例给出 -21->10->4->5, tail connects to node index 1,返回 true定义两个指针slow, fast。从头指针开始,slow指针一次走1个结点,fast指针一次走2个结点。如果链表中有环,那么慢指针一定会再某一个时刻追上快指针(slow == fast)。如果没有环,则快指针会第一个走到NULL。/原创 2017-07-13 12:01:22 · 234 阅读 · 0 评论 -
有环单链表相交
如何判断两个有环单链表是否相交?相交的话返回第一个相交的节点,不想交的话返回空。如果两个链表长度分别为N和M,请做到时间复杂度O(N+M),额外空间复杂度O(1)。给定两个链表的头结点head1和head2(注意,另外两个参数adjust0和adjust1用于调整数据,与本题求解无关)。请返回一个bool值代表它们是否相交。/*struct ListNode { int原创 2017-08-30 19:52:41 · 301 阅读 · 0 评论 -
环形链表插值
有一个整数val,如何在节点值有序的环形链表中插入一个节点值为val的节点,并且保证这个环形单链表依然有序。给定链表的信息,及元素的值A及对应的nxt指向的元素编号同时给定val,请构造出这个环形链表,并插入该值。测试样例:[1,3,4,5,7],[1,2,3,4,0],2返回:{1,2,3,4,5,7}/*struct ListNode { in原创 2017-08-30 11:58:40 · 336 阅读 · 0 评论 -
[LintCode]35.翻转链表 ***
翻转一个链表样例给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null第一种方法就是重新建立一个单链表newList,每次将head中的第一个结点放到newList后面。/** * Definition of ListNode * * class ListNode { * public: * int val;原创 2017-07-13 22:48:56 · 475 阅读 · 0 评论 -
[LintCode]112.删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素每个元素只留下一个。样例给出 1->1->2->null,返回 1->2->null给出 1->1->2->3->3->null,返回 1->2->3->null/** * Definition of ListNode * class ListNode { * public: * int val; * L原创 2017-08-20 00:52:29 · 212 阅读 · 0 评论 -
[LintCode]372.在O(1)时间复杂度删除链表节点
给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。样例 Linked list is 1->2->3->4, and given node 3, delete the node in place 1->2->4思路:关于单链表的删除,通常先从链表的头节点开始顺序找到被删节点的前驱节点,然后再删除节点,主要时间耗费在原创 2017-07-13 11:01:10 · 335 阅读 · 0 评论 -
[LintCode]166.链表倒数第n个节点
找到单链表倒数第n个节点,保证链表中节点的最少数量为n。样例给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1.一种是先遍历一遍单链表,计算链表的长度,然后再次遍历,直到到达节点数减去n的节点,返回结果。实际情况中若链表数目很多而n相对不大,这种方法需要大约两次遍历。更简单的是采用双指针。快指针比慢指针提前n个单元。当快指针到达单链表尾原创 2017-07-13 12:03:52 · 396 阅读 · 0 评论 -
[LintCode]165.合并两个排序链表
将两个排序链表合并为一个新的排序链表样例给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。第一种方法是采用递归,根据两个链表的头节点大小决定合并后链表的头节点,重复此步骤,典型的递归过程。/** * Definition of ListNode * class ListNo原创 2017-07-14 16:27:47 · 295 阅读 · 0 评论 -
从尾到头打印链表
输入一个链表,从尾到头打印链表每个节点的值。思路:用insert函数每次扫描一个节点,将该结点数据存入vector中,如果该节点有下一节点,将下一节点数据直接插入vector最前面,直至遍历完/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(i原创 2017-07-16 11:11:35 · 187 阅读 · 0 评论 -
[LintCode]167.链表求和
你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。样例给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null思路:遍历两个链表知道每个位的值,两个值加上前一位进位值(0或者1)模10就是该位的值,除以10就是向原创 2017-07-16 15:59:18 · 330 阅读 · 0 评论 -
[LintCode]98.链表排序
在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。样例给出 1->3->2->null,给它排序变成 1->2->3->null.思路:对链表进行排序,时间复杂度为O(n log n),最好使用归并排序,快速排序在最坏的情况下时间复杂度为O(n^2)。利用归并的方法进行排序,完成两个主要功能即可:拆分和合并。拆分用到了比较好的方法就是利用快慢原创 2017-07-16 22:53:05 · 769 阅读 · 0 评论 -
[LintCode]113.删除排序链表中的重复数字 II
给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。样例给出 1->2->3->3->4->4->5->null,返回 1->2->5->null给出 1->1->1->2->3->null,返回 2->3->null思路:因为是排序链表,所以每次判断和后面的是不是一样即可。创建一个新的链表头节点dummy,用来存放链表中没有重复的数字,也解决了头节点原创 2017-07-19 15:53:51 · 223 阅读 · 0 评论 -
[LintCode]174.删除链表中倒数第n个节点
给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。注意事项:链表中的节点个数大于等于n样例给出链表1->2->3->4->5->null和 n = 2.删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.思路:题目是在在“LintCode]166.链表倒数第n个节点”的基础上增加功能,我们已经有了寻找倒数第n个节点原创 2017-08-05 21:51:03 · 264 阅读 · 0 评论 -
[LintCode]380.两个链表的交叉
请写一个程序,找到两个单链表最开始的交叉节点。注意事项如果两个链表没有交叉,返回null。在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循环。样例下列两个链表:A: a1 → a2 ↘ c1 → c2 → c3原创 2017-08-18 14:17:19 · 1432 阅读 · 0 评论 -
单链表相交
给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false。给定两个链表的头结点head1和head2(注意,另外两个参数adjust0和adjust1用于调整数据,与本题求解无关)。请返回一个bool值代表它们是否相交。思路:找到两个链表进入环的第一个节点:1、都为空,两个都无环 2、一个为空原创 2017-08-30 19:57:05 · 241 阅读 · 0 评论