剑指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,那么他就是一颗平衡二叉树.如下图: 所以 ...
随机推荐
- Gemini.Workflow 双子工作流入门教程三:定义流程:流程节点、迁移条件参数配置
简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:定义流程:流程节点.迁移条件参数配置. 一.普通节 ...
- A Pangram
Codeforces Round #295 div2 的A题,题意是判读一个字符串是不是全字母句,也就是这个字符串是否包含了26个字母,无论大小写. Sample test(s) input 12 t ...
- 如何使用ipv6
需要系统至少是Vista以上还有就是要问你们学校是否已经支持IPV6 从Windows Vista开始,IPv6在默认状态下已经安装并启用,无需额外配置.检测步骤开启浏览器窗口,输入以下域名访问本站首 ...
- 1.2 Data Abstraction(算法 Algorithms 第4版)
1.2.1 package com.qiusongde; import edu.princeton.cs.algs4.Point2D; import edu.princeton.cs.algs4.St ...
- Java企业微信开发_12_异常:java.lang.OutOfMemoryError: Java heap space
一.异常现象 今天客户迁到正式环境,在做企业微信 接收消息服务器配置 时,出现如下异常: java.lang.OutOfMemoryError: Java heap space 二.异常原因 JAV ...
- C语言中mktime函数功能及用法
今天联系写一个日历的程序,需要算出月份中的第一天是星期几,用到了mktime()这个函数,感觉这个函数挺有用的,分享给大家. 原型:time_t mktime(struct tm *) 其中的tm结构 ...
- PS 滤镜— — 万花筒效果
clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...
- cm 安装
为Cloudera Manager建立数据库:/usr/share/cmf/schema/scm_prepare_database.sh mysql -h[mysql数据库的主机名] -P63751 ...
- BZOJ_4033_[HAOI2015]树上染色_树形DP
BZOJ_4033_[HAOI2015]树上染色_树形DP Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的 ...
- [JSOI 2018] 潜入行动
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5314 [算法] 考虑dp , 用f[i][j][0 / 1][0 / 1]表示以i为 ...