题目如下:
输入一个链表,输出该链表中倒数第k个结点,为了符合大多数人习惯,本题从第一个开始计数,即链表的尾节点是倒数第一个节点,如有一个链表结点依次为: 1 2 3 4 5 6,则倒数第3个结点是数值为4的结点。
求链表中倒数第k个节点,这个问题主要要注意两个方面:
一是思路:刚看到这个题肯定想倒着数k个就行了,但这个是单项链表,因此我们无法逆着来寻找,但我们可以将链表存在一个栈中,弹出k个即可,这样虽然可以实现,但并不够简便,我们可以设置两个下标,当两个下标距离k-1个,则前面的下标到达链表尾时,后面的下标就是我们要的结果。这是我们的解题思路。
第二个要注意的就是入口参数检查,这个题要注意的点比较多:既要注意链表是否为空,又要注意链表的长度是否小于k,这两个还都比较容易发现,一个比较难发现的点是k的取值并不一定是正数,这里如果k是0,我们也应该返回合适的值(返回null或者报异常)
代码实现如下:
public class KthNodeFromEndInList {
/*
找链表中的倒数第k个节点
DeleteListNodeInO1.java 已经定义过Node类
Node类定义如下:
class Node{
public Node(int n){
this.number = n;
}
public Node(){
this(0);
}
private int number;
private Node next;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
@Override
public String toString() {
return "Node [number=" + number + "]";
}
}
*/
public static void main(String[] args) {
//创建长度为n的链表
Scanner input = new Scanner(System.in);
int k = input.nextInt();//找倒数第k个节点
if (k <= 0) {
throw new RuntimeException("k必须大于0");
}
Node head = new Node();
Node tmp = head;
while(!input.hasNext("end")){
head.setNext(new Node(input.nextInt()));
head = head.getNext();
}
System.out.println((findKth(tmp.getNext() , k )).getNumber());
}
private static Node findKth(Node root , int k) {
// TODO Auto-generated method stub
if (root == null) {
throw new RuntimeException("输入错误");
}
int i = 0;
Node end = root;
while(i < k - 1){
if (end.getNext() == null) {
throw new RuntimeException("您输入的节点太少");
}
end = end.getNext();
i++;
}
Node begin = root;
while(end.getNext() != null){
begin = begin.getNext();
end = end.getNext();
}
return begin;
}
}