Day14:链表中倒数第k个结点
剑指Offer_编程题——链表中倒数第k个结点
题目描述:
输入一个链表,输出该链表的倒数第k个结点。
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
思路一: 我们需要遍历出链表的长度,然后遍历出我们需要的倒数第k个结点,这是我们常规的想法,当然也考虑了代码的鲁棒性和空指针,k为0,k应该大于链表的长度。 1、首先我们用Java实现该思路:
public class Solution{
public ListNode FindKthToTail(ListNode head, int k){
if(head == null || k <= 0)
return null;
ListNode p = head;
int n = 0;
while(p != null){
n++;
p = p.next;
}
ListNode q = head;
for(int i = 0; i <n - k; i++){
q = q.next;
}
if(n < k)
return null;
else
return q;
}
}
代码效果图如图所示:
如果在牛客网中,此时代码即可编译通过,因为该编译器已经定义了结点,定义的形式如下图所示:
但是,我们如果在本地编译器(eclipse和IDEA)的时候,就得将该节点的定义写上,否则无法通过编译,具体实现如下:
public class ListNode{
int val;
ListNode next = null;
ListNode(int val){
this.val = val;
}
}
2、用python将其思路实现:
class Solution:
def FindKthToTail(self, head, k):
if(head == None or k == 0):
return None
nodeFir = head
nodeSco = head
for i in range(1, k):
if(nodeFir.next != None):
nodeFir = nodeFir.next
else:
return None
while(nodeFir.next != None):
nodeFir = nodeFir.next
nodeSco = nodeSco.next
return nodeSco
代码效果图如图所示:
思路二: 利用栈来解决这个问题,先压入栈 ,在取出k个值便是倒数取k个值,具体用python实现如下:
class Solution:
def FindKthToTail(self, head, k):
if(head == None or k == 0):
return None
count = 0
stack = []
while(head != None):
stack.append(head)
head = head.next
count += 1
if(count < k):
return None
for i in range(0, k):
kNode = stack.pop()
return kNode
代码效果图如图所示:
思路三: 我们接下来探讨一种崭新的思路,首先设置两个指针,将他们之间的长度设置为k,这里需要我们注意的是,我们定义的这两个指针是两把尺子,当尺子的末指针指向链表的末尾时,它的首指针就指向第k个结点。因此在实现的过程中,我们重点是当i>=k时,尺子的首指针在进行移动。具体代码的实现如下:
public class Solution{
public ListNode FindKthToTail(ListNode head, int k){
if(head == null || k == 0)
return null;
ListNode p;
ListNode q;
p = head;
q = p;
int i = 0;
for(; p != null; i++){
if(i >= k)
q = q.next;
p = p.next;
}
if (i < k)
return null;
else
return q;
}
}
代码效果图如图所示:
总结
本道题主要通过输入链表考察链表的输出结点,最基本的方法就是遍历出链表的长度,然后遍历出你所需要的倒数第K个节点。更进一层的方法就是利用栈来进行处理,最高级的也是最难想到的就是设置两个指针来进行解决,最难的就是循环时当i>=k时,指针进行移动。我们要借鉴别人的一些好的idea,拓宽自己的思路。总之,继续加油,争取早日找到工作,Good Luck!!!
参考文献
本文的代码主要参考以下文章: [1] destiny_python [2] 女朋友说
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- .img/.hdr格式转.nii格式的操作
- PHP实现的操作数组类库定义与用法示例
- python使用nibabel和sitk读取保存nii.gz文件实例
- PHP从尾到头打印链表实例讲解
- python如何写try语句
- python怎么判断素数
- php数组遍历类与用法示例
- PHP格式化显示时间date()函数代码
- python操作微信自动发消息的实现(微信聊天机器人)
- 使用ITK-SNAP进行抠图操作并保存mask的实例
- Yii2框架加载css和js文件的方法分析
- php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
- python如何求圆的面积
- php实现微信公众号企业转账功能
- PHP通过调用新浪API生成t.cn格式短网址链接的方法详解