输出单项链表中倒数第k个结点——牛客刷题

题目描述:

输入一个单向链表,输出该链表中倒数第k个结点

输入、输出描述:

输入说明:1、链表结点个数 2、链表结点的值3、输入k的值

输出说明:第k个结点指针

题目分析:

假设链表长度为n,倒数第k个结点=正序第n-k+1个结点,所以题目的实质可以看作是链表的遍历。

首先输入链表结点个数n与各个结点取值构建链表并返回链表的头指针;

其次,输入k,调用链表遍历函数,找到第n-k+1个结点.

主函数:

import java.util.Scanner;
public static void main(String[]args){
    Scanner scan=new Scanner(System.in); 
    int n=scan.nextInt();    
    ListNode pHead=init();                                           //初始化链表
    int k=scan.nextInt();
    System.out.print(FindKthToTail(pHead,n,k).val);    //遍历链表
}

初始化链表函数:

public static ListNode init(){
        Scanner scan=new Scanner(System.in);
        String[] array=scan.nextLine().split(" ");
        ListNode pHead=new ListNode(Integer.parseInt(array[0]));
        ListNode walkNode=pHead;
        for(int i=1;i<array.length;i++){
            ListNode newNode=new ListNode(Integer.parseInt(array[i]));
            walkNode.next=newNode;
            walkNode=newNode;
        }
        return pHead;
}

遍历函数: 

public static ListNode FindKthToTail(ListNode pHead,int n, int k){
	int index=n-k+1;
	int count=1;
	ListNode walkNode=pHead;
	while(walkNode!=null&&count<index){
		count++;
		walkNode=walkNode.next;
	}
	return walkNode;
}

完整代码:

import java.util.Scanner;

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
public class countk {
	public static ListNode FindKthToTail(ListNode pHead,int n, int k){
		int index=n-k+1;
		int count=1;
		ListNode walkNode=pHead;
		while(walkNode!=null&&count<index){
			count++;
			walkNode=walkNode.next;
		}
		return walkNode;
	}
	public static ListNode init(){
		Scanner scan=new Scanner(System.in);
		String[] array=scan.nextLine().split(" ");
		ListNode pHead=new ListNode(Integer.parseInt(array[0]));
		ListNode walkNode=pHead;
		for(int i=1;i<array.length;i++){
			ListNode newNode=new ListNode(Integer.parseInt(array[i]));
			walkNode.next=newNode;
			walkNode=newNode;
		}
		return pHead;
	}
	public static void main(String[]args){
		Scanner scan=new Scanner(System.in); 
		int n=scan.nextInt();	
		ListNode pHead=init();
		int k=scan.nextInt();
		System.out.print(FindKthToTail(pHead,n,k).val);
	}

}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值