题目描述

输入一个链表,输出该链表中倒数第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个点的更多相关文章

  1. (剑指Offer)面试题15:链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...

  2. 《剑指offer》— JavaScript(14)链表中倒数第k个结点

    链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点: 然后两个指针同时 ...

  3. 《剑指offer》面试题15—输出链表中倒数第n个结点

    题目:如题,且从1开始计数. 思路:要求只遍历一遍链表:设置两个指针,一个先走n步后另一个开始同步后移,当快指针已经到链表尾时慢指针正好到要输出的结点. 注意:本题思路比较好想到,主要考察的是代码的鲁 ...

  4. 剑指Offer的学习笔记(C#篇)-- 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...

  5. 剑指Offer的学习笔记(C#篇)-- 反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...

  6. 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...

  7. 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  8. 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将  num1[0], num2[0 ...

  9. 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...

随机推荐

  1. HTML5/CSS3简易版俄罗斯方块游戏

    在线演示 本地下载

  2. Linux系统资源查看与设置

    /proc/sys/fs/file-max = 65536 /proc/sys/net/ipv4/tcp_fin_timeout = 15 /proc/sys/net/ipv4/tcp_tw_recy ...

  3. ceres求解BA第10章

    1.前言g2o是根据边来保存每一个代价函数,它是在边类中构造误差函数,构造边的时候,会设置顶点.测量值.协方差矩阵等.而在ceres中,用problem类型来构造最终的目标函数.先是使用AddResi ...

  4. URAL - 1297 Palindrome —— 后缀数组 最长回文子串

    题目链接:https://vjudge.net/problem/URAL-1297 1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB ...

  5. VLAN虚拟局域网技术(三)-计算机网络

    本文主要知识来源于学校课程,部分知识来自于H3C公司教材,未经许可,禁止转载.如需转载,请联系作者并注明出处. 本节主要介绍 pVLAN和 动态VLAN. 1.   pVLAN:英文全称Private ...

  6. Cocos2d-x中单例的使用

    大家都知道一个程序中只有一个导演类,eg: CCDirector *pDirectory = CCDirector::sharedDirector();//初始化导演类. 可通过 pDirectory ...

  7. C# 多线程、控制线程数提高循环输出效率

    C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...

  8. onhashchange

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. ACM学习历程—ZOJ3878 Convert QWERTY to Dvorak(Hash && 模拟)

    Description Edward, a poor copy typist, is a user of the Dvorak Layout. But now he has only a QWERTY ...

  10. 媒体格式分析之flv -- 基于FFMPEG

    本来是应该先写一个媒体文件格式的简单讲解的,还没来得及写,以后再写.今天就先根据ffmpeg的flv.c的flv_demux这个结构体来讲解一下当前比较流行的媒体格式flv. FLV 是FLASH V ...