《剑指offer》 链表中倒数第k个节点
本题来自《剑指offer》 链表中倒数第k个节点
题目:
输入一个链表,输出该链表中倒数第k个结点。
思路:
倒数第k个节点,而且只能访问一遍链表,定义两个节点,两者之间相差k个距离,遍历到尾节点,则便找到了倒数k节点了。
考虑代码的鲁棒性。代码的鲁棒是指程序能够判断输入是否合乎规范要求,并对不合理的输入给予合理的处理。
1.如果传入的根节点是空:直接返回空
2.传入的数据少于k个:在遍历前k个节点时候,如果发现为空,则直接返回空
3.传入的k为小于或者等于0:直接返回空
4.正常的数据,first和second两者相隔k,依次遍历
C++ Code:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (!pListHead || k<=){ //鲁棒性检测,如果头指针为空或者k小于0直接返回空
return NULL;
}
ListNode* first = pListHead;
ListNode* second = pListHead;
for (int i=;i<k;i++){ //第二个节点和第一个节点相隔k个距离
if (!second){
return NULL;
}
second = second->next;
}
while (second){ //第一个和第二个节点依次遍历,直到尾节点为止
first = first->next;
second = second->next;
}
return first; //第一个节点便是倒数第k个节点
}
};
Python Code:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k <=0 : #如果head为空或者k小于0,直接返回空
return None
first,second = head,head
for i in range(k): #第二个指针和第一个指针相差k个距离
if not second : #考虑,如果个数都小于k,则直接返回空
return None
second = second.next
while second: #两者同时遍历,直到道尾节点
first = first.next
second = second.next
return first #第一个节点就是倒数k个节点了
总结:
要考虑输入参数的鲁棒性,输入可能取得所有值,比如边界值,要考虑这些值的处理方法。
类似题目:
A.求链表的中间节点:如果链表的中间节点总数为奇数,返回中间节点,如果为偶数,返回中间的其中一个。
定义两个节点,第一个节点first一次跨一步。
第二个节点second一次跨两步,当该节点是尾节点时候,刚好第一个节点是中间节点。
B.判断一个链表是否形成了环形节点
同上,定义两个指针,慢指针一次跨一步,快的指针一次跨两步,如果快的赶上了慢的,则表明是环形,如果快的指针走到了链表的末尾即为空,则表明不是环形链表。
《剑指offer》 链表中倒数第k个节点的更多相关文章
- 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)
题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next! ...
- 链表中倒数第K个节点
问题描述: 找出链表中倒数第K个节点 思路分析: 用两个指针,一前一后,保持k个距离,前面的指针移动到末尾,后面的指针就刚好直到第k个节点, 要考虑到k为0,倒数第k个节点不存在的情况. 参考代码: ...
- 链表中倒数第k个节点(Java)
链表中倒数第k个节点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路:two-pointers思想,因为是单链表,没法得prevous点,直接遍历得到链表长度再重新遍历效率很低. 采用双指 ...
- 剑指offer(14)链表中倒数第K个节点
题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...
- 15:链表中倒数第K个节点
/** * 面试题15:链表中倒数第K个节点 * 输入一个链表,输出该链表中倒数第k个结点. */ public class _15_linked_K { public static void mai ...
- php实现求链表中倒数第k个节点
php实现求链表中倒数第k个节点 一.总结 $head = $head->next; //1.将$head节点next域里面的记录的那个地址值($head节点的下一个节点的地址)给$head,$ ...
- 【剑指offer】面试题 22. 链表中倒数第 K 个节点
面试题 22. 链表中倒数第 K 个节点
- 题目15 链表中倒数第K个节点
///////////////////////////////////////////////////////////////////////////////////// // 5. 题目15 链表中 ...
- LeetCode 面试题22. 链表中倒数第k个节点
题目链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 输入一个链表,输出该链表中倒数第 ...
随机推荐
- python 的基础 学习 第六天 基础数据类型的操作方法 字典
1,字典 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且ke ...
- java乱码解决方法
String name = request.getParameter("name"); 乱码解决:String name = new String(request.getParam ...
- 【Linux】LD_PRELOAD用法
转载https://blog.csdn.net/iEearth/article/details/49952047 还有一篇博客也可以看看https://blog.csdn.net/xp5xp6/art ...
- mysql 开源 ~ canal+otter系列(2)
一 创建相应用户 源数据用户权限: GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `retl`@'%'; 目的 ...
- Day19-File操作-创建 删除,文件过滤
import java.io.File; import java.io.IOException; /* *创建功能: *public boolean createNewFile():创建文件 如果存在 ...
- java中有哪4种整形数据类型?它们有什么不同之处?
java中有哪4种整形数据类型?它们有什么不同之处? (byte.short.int和long型)最大值和最小值都不一样.
- python - 字符编码/格式化/替换符
- Microsoft SQL - 数据库管理系统
数据库管理系统(Server Management Studio) SQL Server Management Studio是一个数据库管理系统软件,数据库可以看成是一个个存储数据的文件,而Manag ...
- CF1100B Build a Contest
题目地址:CF1100B Build a Contest 水题,比赛时没想就敲了个 \(O(n^2)\) 的暴力上去,结果过了Pretest,然后被Hack了 两个数组: \(c_i\) 表示 \(i ...
- 利用binlogserver恢复单表实验【转】
使用场景 每次开启binlogserver 指定了mysql-bin.0000XX 后都会从该点从头进行传输一次 创建binlogserver [root@mysql-zst3 binlogserve ...