剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
一 . 数据结构基础概念普及(线性表)。
线性表可分为顺序表与链表,它们是堆栈、队列、树、图等数据结构的实现基础。
顺序表,线性表的顺序存储结构是指:用一块地址连续的存储空间依次存储线性表中的数据元素。他在逻辑上相邻的元素在物理上也是相邻的。什么意思呢,我们可以这样想象,去食堂排队打饭,打饭的队列就是一个顺序表,加粗部分的存储空间指的是我们排队所占据的位置;红色字体所说的概念可以理解为我们打饭的顺序必须要按照从前往后的顺序依次进行,即逻辑顺序=物理顺序,如果此处不好理解,看完下面就好懂了许多。
链表,相比顺序表需要预先占用一块事先分配好的存储空间,链表就灵活一些。链表中逻辑上相邻的元素在物理上可以不相邻。从这里可以看出,链表和顺序表是在相邻元素之间存在差异的,这段红字怎么理解呢,举个例子:我们去银行办理业务,银行都是有取号机的,我们办理业务的顺序并不是顺序表那样的物理顺序,而是依据你手上的号码顺序进行办理,所以呢,我们就不需要排队,在办事大厅随便坐,当号码轮到我们的时候,就可以办理了,这就实现了逻辑相邻但物理顺序不相邻。

回归题目,在链表中,链表是由N个节点链接而成的线性表,每个节点由两部分组成:数据域和指针域。如果其中每个节点只包含一个指针域那么就称为单链表,如果含有两个指针域那么就称为双链表。结合右上图来理解:数据域可以理解成我们要办理的业务(比如取多少钱),指针域可以理解成,取号机里面取出的号码。
代码实现定义一个单链表如下:
public class Node<T>
{
// 数据域
public T Item { get; set; }
// 指针域
public Node<T> Next { get; set; } public Node()
{
} public Node(T item)
{
this.Item = item;
}
}
Node类为单链表的节点,其中包括了一个数据域Item与一个指针域Next(指向后继节点的位置)。
废话又多了,再次回归题目,求链表中的倒数第K个节点,直接使用最高效的方法:即为双指针法。通俗的理解方法:我们让第一个指针先走,当走到第(K-1)个指针时,第二个指针出发,然后同步进行,这样两个指针之间的距离一直保持在(k-1),当第一个指针遍历到最后一点时,那是不是第二个刚好在倒数第K个点呢,不难吧,小学生应该也会。
二 . 代码实现
class Solution
{
public ListNode FindKthToTail(ListNode head, int k)
{
// write code here
//鲁棒判定
if(head == null || k == )
{
return null;
}
//定义前后指针数据与链表长度
ListNode a = head;
ListNode b = head;
int count = ;
//两指针K差距判定
while(a!=null)
{
count++;
a = a.next;
if((count - k)>)
{
b = b.next;
}
}
//链表长度不可等于或者小于节点k
if (count <= k)
{
return null;
}
//返回倒数第K个节点数据
return b;
}
}
但是,该题目的考点是代码的鲁棒性!!!所以,更要细心的去分析,该题目中存在三处,以下一一解决:
1. 空指针问题。解决方案:在代码中加入了判断空指针的代码。
2. 链表长度少于k。解决方案:在for循环中增加判断下一个节点是否是空指针的代码。
3. 输入的参数k为0。解决方案:在代码中加入判断参数k是否为0的代码。
剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点的更多相关文章
- (剑指Offer)面试题15:链表中倒数第k个结点
题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...
- 《剑指offer》— JavaScript(14)链表中倒数第k个结点
链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点: 然后两个指针同时 ...
- 《剑指offer》面试题15—输出链表中倒数第n个结点
题目:如题,且从1开始计数. 思路:要求只遍历一遍链表:设置两个指针,一个先走n步后另一个开始同步后移,当快指针已经到链表尾时慢指针正好到要输出的结点. 注意:本题思路比较好想到,主要考察的是代码的鲁 ...
- 剑指Offer的学习笔记(C#篇)-- 序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
- 剑指Offer的学习笔记(C#篇)-- 反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...
- 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...
- 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将 num1[0], num2[0 ...
- 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...
随机推荐
- Git core objects
Git core objects Core objects in git blob object tree object commit object Git low level commands gi ...
- 如何设置确认selinux 模式【转】
本文转载自:http://blog.csdn.net/lei1217/article/details/48377109 [Description]linux SELinux 分成Enforce 以及 ...
- GPIO设备虚拟文件结点的创建【转】
本文转载自:http://blog.csdn.net/dwyane_zhang/article/details/6742066 所谓GPIO设备虚拟文件结点,就是方便用户在应用程序直接操纵GPIO的值 ...
- win10专业版激活(亲测可用)
1.slmgr.vbs /upk 2.slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX 3.slmgr /skms zh.us.to 4.slmgr /ato
- Warning: Cannot send session cookie – headers already sent…
相信大多数人在写PHP代码的时候,都遇到过类似 "Warning: Cannot send session cookie – headers already sent…“或者”Cannot ...
- PYTHON 爬虫笔记五:BeautifulSoup库基础用法
知识点一:BeautifulSoup库详解及其基本使用方法 什么是BeautifulSoup 灵活又方便的网页解析库,处理高效,支持多种解析器.利用它不用编写正则表达式即可方便实现网页信息的提取库. ...
- python绘制圆和椭圆
源自:https://blog.csdn.net/petermsh/article/details/78458585 1. 调用包函数绘制圆形Circle和椭圆Ellipse from matplot ...
- IDEAL葵花宝典:java代码开发规范插件 FindBugs-IDEA
前言: 检测代码中可能的bug及不规范的位置,检测的模式相比p3c更多,写完代码后检测下 避免低级bug,强烈建议用一下,一不小心就发现很多老代码的bug. 使用步骤: 1):打开 Settings ...
- OpenCV——PS滤镜之 波浪效果 wave
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- iOS 自定义UINavigationController返回按钮
主要代码如下: //自定义导航栏返回按钮 self.navigationItem.leftBarButtonItem = ({ //导航栏返回背景视图 UIView *view = [[UIView ...