本篇延续上一篇剑指offer题目系列二,介绍《剑指offer》第二版中的四个题目:O(1)时间内删除链表结点、链表中倒数第k个结点、反转链表、合并两个排序的链表。同样,这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺序,每个题目包含了分析和代码。

9、O(1)时间内删除链表结点

题目:

在O(1)时间内删除链表结点。给定单链表的头指针和一个结点指针,定义一个方法在O(1)时间内删除该结点。

单链表的定义如下:

解答:

单向链表删除一个结点,最直观的想法是从链表的头结点开始顺序遍历查找要删除的结点,然后删除该结点,这种做法的时间复杂度为O(n),显然不满足本题要求。如果我们把下一个结点的信息复制到要删除的结点上,覆盖原有内容,再把下一个结点删除,这样就相当于把该结点删除了,本题解法基于这种方式。

首先把要删除的结点(i)的下一个结点(j)的信息复制到结点i,然后把i指向它的下下个结点(即j的下一个结点),然后再把结点j删除,这样就把i删除了。有两个特殊情况:如果要删除的结点i所在的链表中只有一个结点,那么将其置空(null)即可;如果要删除的结点i是链表尾部的最后一个结点,这就需要从链表的头结点开始,顺序遍历链表到该结点,然后将其置空(null),完成删除。

代码:

可以看到,删除头结点和中间结点的时间复杂度为O(1),而删除尾结点的时间复杂度为O(n),但总的平均时间复杂度还是O(1),符合要求。

10、链表中倒数第k个结点

题目:

输入一个链表,输出该链表中倒数第k个结点。按大多数人的习惯,设链表的尾结点为倒数第一个结点。

单链表的定义如下:

解答:

本题采用快慢指针的思想,可以定义两个指针。第一个指针从链表的头结点开始遍历k-1个结点,第二个指针保持不动;当第一个结点遍历到第k个结点时,第二个结点从链表的头结点开始遍历,两个指针的距离始终保持k-1。当第一个指针遍历到链表的尾结点时,此时第二个指针所在的位置正是倒数第k个结点的位置。需要注意的是链表不能为空(null),同时k不能大于链表长度。

代码:

11、反转链表

题目:

定义一个方法,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

单链表的定义如下:

解答:

本题需要知道三个结点,即当前结点(node)、当前结点的前一个结点(preNode)、当前结点的下一个结点(nextNode)。

反转时,将当前结点(node)的下一个结点指向其前一个结点(preNode),这样当前结点(node)与其原来的下一个结点(nextNode)之间发生了断裂,所以需要保存其原来的下一个结点(nextNode)信息。然后将当前结点赋值给前一个结点(preNode),下一个结点赋值给当前结点……以此类推,直到下一个结点为空,此时当前结点就是反转后链表的头结点。

代码:

12、合并两个排序的链表

题目:

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是递增排序的。

例如:输入链表1:1->3->5->7

链表2:2->4->6->8

返回链表:1->2->3->4->5->6->7->8

单链表的定义如下:

解答:

本题采用递归方法,利用归并的思想。

首先定义一个新链表(newList),存放合并后的数据。然后分别遍历两个链表(list1和list2)的头结点,比较其大小。如果list1的头结点小于等于list2的头结点,则将list1的头结点添加到新链表中(newList),然后将list1头结点的下一个结点与list2的头结点作为参数,执行本方法(即递归);反过来如果list1的头结点大于list2的头结点,则将list2的头结点添加到新链表中(newList),然后将list1的头结点与list2头结点的下一个结点作为参数,执行本方法(即递归)……以此类推,不断递归,直到list1或list2为空,然后将另一个列表剩余结点直接放到新链表中即可。

例如题目中两个链表第一次比较时,list1的头结点1小于list2的头结点2,故list1头结点1放入newList中;然后list1头结点的下一个结点3大于list2的头结点2,故list2头结点2放入newList中;然后list1头结点的下一个结点3小于list2头结点的下一个结点4,故list1头结点的下一个结点3放入newList中……

代码:

转载请注明出处 http://www.cnblogs.com/Y-oung/p/8933438.html

工作、学习、交流或有任何疑问,请联系邮箱:yy1340128046@163.com  微信:yy1340128046

剑指offer题目系列三(链表相关题目)的更多相关文章

  1. 剑指offer自学系列(三)

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,例如{5,1,4,2 ...

  2. 【Java】 剑指offer(52) 两个链表的第一个公共结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个 ...

  3. 剑指offer:从头到尾打印链表

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:从头到尾打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 首先题目实际给出的要求是返回ve ...

  4. 剑指Offer - 九度1517 - 链表中倒数第k个结点

    剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...

  5. 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针

    剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...

  6. 力扣 - 剑指 Offer 52. 两个链表的第一个公共节点

    题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的 ...

  7. 《剑指offer》总结三 之二叉树(2)

    目录 23.二叉搜索树的后序遍历序列 26.二叉搜索树与双向链表(31ms,5756k) 23.二叉搜索树的后序遍历序列 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如 ...

  8. 《剑指offer》两个链表中的第一个公共节点

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  9. Go语言实现:【剑指offer】两个链表的第一个公共结点

    该题目来源于牛客网<剑指offer>专题. 输入两个链表,找出它们的第一个公共结点. Go语言实现: //长度长的先走个长度差,然后ab一起比较后面结点 //长度一样,公共结点可能在首结点 ...

  10. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

随机推荐

  1. mysql登录:access denied for user 'root'@'localhost'(using password:YES)

    mysql登录: access denied for user 'root'@'localhost'(using password:YES) 解决: use mysql; select user,ho ...

  2. 设计模式:装饰器(Decorator)模式

    设计模式:装饰器(Decorator)模式 一.前言    装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...

  3. Linux:配置HTTPS,获取ssl证书

    这里小仓鼠将Https配置流程记录下来 1.访问网站:https://www.aliyun.com/ss/?k=ssl 2.选择‘立即购买’ 3. 页面变换为: 4.点击‘立即购买’ 5.进行支付 6 ...

  4. SVN安装操作流程

    SVN 安装操作流程 1.服务端安装流程 1.1 双击打开svn-server安装包 1.2 点击Next 1.3 勾选上“I accert the terms in the License Agre ...

  5. 《SQL必知必会》总结

    目录   第1章 了解SQL 第2章 检索数据 第3章 排序检索数据 第4章 过滤数据 第5章 高级数据过滤 第6章 用通配符进行过滤 第7章 创建计算字段 第8章 使用数据处理函数 第9章 汇总数据 ...

  6. 3spring:生命周期,属性赋值,自动装配

    有不懂的可以参考之前的文章! https://www.cnblogs.com/Mrchengs/p/10109053.html 1.Bean的生命周期     创建---初始化---销毁   容器管理 ...

  7. HDU 2102 A计划(两层地图加时间限制加传送门的bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  8. java 编写小工具 尝试 学习(四)

    1.在新建 的窗口上 ,添加了一个按钮后 ,给 按钮添加一个事件 ,意思就是  点击按钮后 发生什么事情!不废话 贴图 贴 代码! package jFrameDemo; import java.aw ...

  9. springboot集成activiti工作流时容易出现的问题

    No.1 启动报错 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'or ...

  10. HTML&CSS 问题

    1.子div使用浮动,父div高度自适应(个人感觉好用) 方法: css: <style> .clear{ clear:both} </style> html:在父div关闭之 ...