剑指Offer系列(14)—— 链表中倒数第k个节点

题目如下:

输入一个链表,输出该链表中倒数第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;

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值