题目描述

输入一个链表,输出该链表中倒数第k个结点。例如有一个链表有六个节点1,2,3,4,5,6.则它的倒数第二个节点为5

节点定义如下:

public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}

思路一:

设置一个快指针,一个慢指针。像一把尺子,当尺子的一端移动到链表的末尾,则另一端则为倒数第k个节点。

public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null||k<=0)
return null;
ListNode p,q; //定义两个快慢指针,制造一把尺子
p=q=head;
int i=0;
for(;p!=null;i++){
if(i>=k)
q=q.next;
p=p.next;
}
return i<k?null:q;
}
}

思路二:

两次遍历。第一次遍历出链表的长度n,第二次遍历获取链表第n-k+1个节点。

public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null||k<=0)
return null;
//1.遍历链表的长度
int n=0;
ListNode tempNode = head;
while(tempNode!=null){
n++;
tempNode = tempNode.next;
}
if(k>n)
return null;
//2.遍历获取第n-k+1个节点
for(int i=0;i<n-k;i++){
head = head.next;
}
return head;
}
}

思路三:

借助栈来存储所有节点,在利用出栈获取倒数第k个节点

public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null||k<=0)
return null;
//1.借助栈来存储节点
Stack<ListNode> stack = new Stack<>();
while(head!=null){
stack.push(head);
head=head.next;
}
//判断k是否越界
if(k>stack.size())
return null;
//2.出栈来获取倒数第k个节点
while(k>1){
stack.pop();
k--;
}
return stack.pop();
}
}

最新文章

  1. 基于HTML5的WebGL结合Box2DJS物理应用
  2. php-fpm服务挂掉
  3. 【Python】django权限管理
  4. NotePad++相关设置
  5. 【.NET应用技巧】Asp.NET MVC 4 设置IIS下调试
  6. js实现归并排序
  7. STM32学习笔记——DMA控制器(向原子哥学习)
  8. Linux下修改字符集,转自
  9. Mod_python: The Long Story
  10. R语言入门(2)-数据对象
  11. 【MongoDb入门】15分钟让你敢说自己会用MongoDB了
  12. Git问题总结
  13. mongo aggregate 删除重复数据
  14. 洛谷P3916||图的遍历||反向建图||链式前向星||dfs
  15. Mac更改PHP默认目录
  16. java多线程中并发集合和同步集合有哪些?区别是什么?
  17. Linux常用命令(一)查看日志
  18. js的基本包装类型
  19. C/S,B/S的区别与联系
  20. L325 如何睡觉

热门文章

  1. .Net平台调用の参数对应
  2. java oop第15章_Socket网络编程
  3. python-面向对象-01课堂笔记
  4. 关于springboot错误:“找不到或无法加载主类”的解决办法
  5. 关于synchronized和Lock
  6. SpringBoot中使用Scheduling执行定时任务
  7. 泛型(Generic)类的使用原因和使用方式
  8. thinkphp 模板文件
  9. CF540D Bad Luck Island(期望dp)
  10. Android 配置正式签名和debug签名