- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
链表面试题精讲_七月算法出品
链表面试题精讲 七月算法 曹鹏 2015年4月24日 */16 提纲 链表简介 面试题总体分析 一些例题 例1 链表的插入与(懒)删除 例2 链表翻转 例3 单链表找环及起点和环长度 例4 两个链表找交点 例5 复制带有随机指针的链表 例6 链表partition过程 总结 链表简介 链表 :一个元素和下一个元素靠指针连接(松散),不能O(1)直接访问到第k个元素 单(向)链表 :只能找到下一个节点 双(向)链表: 能找到上一个和下一个节点 循环(单、双)链表:首尾相接 形成环 Java : LinkedList C++ : STL list C : 指针 */21 面试题总体分析 链表的基本操作 插入 删除 (分组)翻转 排序 Partition、归并 复制 归并排序 找环、起点、长度 (倒数)第k个节点 随机返回一个节点 和其他数据结构(二叉树)相互转换 */21 例1 链表的插入与删除 例1 在单链表里插入/删除一个节点 插入 哪些指针要修改?前驱的next, 新节点的next 我们要找到插入之前的那个节点 特殊情况: 在head之前插入(包括head == NULL) now-next = head; head = now; 一般情况:在pre后面插入 now-next = pre-next; pre-next = now; */21 例1 续1 删除 哪些指针要修改?前驱的next 我们要找到删除之前的那个节点 特殊情况? 删除head temp = head-next; delete head; head = temp; 一般情况,在pre后面删除 temp = pre-next; pre-next = temp-next; delete temp; */21 例1 续2 思考题 双向链表的插入、删除 循环有序链表的插入、删除 (建议断开、再连上) “懒”删除 要删除now这个节点 (不是最后一个) 把now复制成now-next now-x = now-next-x 删除now-next */21 例2 单链表翻转 例2 单链表翻转 思路: 把当前节点拿过来作为已经翻转结果的表头 (堆栈类似) ListNode *result = 0; while (head) { temp = head-next; //保存下一个节点 head-next = result; //当前节点放到结果的开头 result = head; //当前节点的头 head = temp; //head指向下一个节点 } return result; */21 例2 续 思考题 翻转部分链表 (Leetcode 92) 如何找到第m个元素和第n个元素 如何处理前面和后面? 保存前面部分最后一个元素 保存后面部分第一个元素 特殊情况? 每k个元素翻转一次 (Leetcode 25) 前面翻好的部分 (小链表) 要翻转的部分(K个) 后面没处理的部分(小链表) 不足k个怎么办 */21 例3 例3 单链表里是否有环?如果有起点是哪里?环长度是多大? (最后一个节点next不是空,而是前面某个节点) (Leetcode 141, 142) 方法1 用一个set存放每个节点地址 注意: set存放的元素必须“有序”,而地址都是“整数” setListNode* have; for (; head; head = head-next) { if (have.find(head) != have.end()) return true; have.insert(head); } return false; */21 例3 续1 方法2 不用set? 用两个指针p1和p2, p1每次走一步,p2每次走两步,如果有圈一定会相遇 为什么一定会相遇? 相遇时如何找交点? 一些变量 圈长 n 起点到圈的起点距离a p1到圈起点时,p2在圈中的位置(0= x n) */21 例3 续2 p1到起点后,经过n – x步相遇 (追及问题) 设相遇点到圈起点距离是b p1走的距离是a + b P2走的距离是a + b + k * n == 2*(a + b) 从而a + b = k * n 如何找圈的起点? 我们把p1拉回起点,p2从相遇点继续走。 a步后,p1到圈起点, p2刚好也到圈起点! 如何找圈长? 相遇后,p2再走一圈并统计长度就是圈长
文档评论(0)