本篇延续上一篇剑指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. zt 我们要找出毒素的藏身处,尽快把它赶出身体

    在中医看来,我们体内有很多毒素,凡是不能及时排出体外.对我们的身体和精神会产生不良作用的物质都可以称为“毒”,例如瘀血.痰湿.寒气.食积.气郁. 上火.这些毒素堆积在五脏之内,就会加速五脏的衰老,然后 ...

  2. OC基础数据类型-NSArray

    1.数组的初始化 NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @&quo ...

  3. bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)

    bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...

  4. WAS缓存问题

    在项目中经常遇见这样的问题:修改应用的配置文件web.xml后,无论重启应用还是重启WebSphere服务器,都不能重新加载web.xml,导致修改的内容无效. 这个问题困扰了我好久,即使删除了${w ...

  5. 手把手带你理解style

    在写代码的时候,经常遇到自定义的style,有的用来设置属性,有的用来设置主题,搞的自己云里雾里,因此在心底暗暗发誓,等到空闲的时候,一定好好学学android中的style的究竟是个什么东西,到底有 ...

  6. ListView实现分页加载(三)实现分页加载

    在上一篇中,我们实现了底部布局(即带上了进度条).没有读过的朋友可以点击下面的链接: http://www.cnblogs.com/fuly550871915/p/4866966.html 但是进度条 ...

  7. BZOJ2822:[AHOI2012]树屋阶梯(卡特兰数,高精度)

    Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为 ...

  8. PHP-------文件上传的实例

    文件上传的实例 一.上传头像 在注册时,要求用户上传头像,登陆主页面,显示用户信息时,头像也要显示出来. 例子: 注册页面: 图片存数据库时是text类型. <title>无标题文档< ...

  9. Yii2.0 请求

    1.获取请求参数 $request = Yii::$app->request; $get = $request->get(); // 等价于:$get = $_GET; $id = $re ...

  10. APICloud的App怎么在手机上测试运行

    方式一: 工程->右键->云编译自定义 AppLoader,如图: 点击[编译iOS自定义loader]或者[编译Android自定义loader],会生成相应的二维码,手机扫描二维码点击 ...