HJ51 输出单向链表中倒数第k个结点

描述

输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。

链表结点定义如下:

struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};

正常返回倒数第k个结点指针,异常返回空指针.

要求:

(1)正序构建链表;

(2)构建后要忘记链表长度。

数据范围:链表长度满足 1≤n≤1000 1≤n≤1000  , k≤n k≤n  ,链表中数据满足 0≤val≤10000 0≤val≤10000

本题有多组样例输入。

输入描述:

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

输出描述:

输出一个整数

示例1

输入:

8
1 2 3 4 5 6 7 8
4
输出:
5

 最终代码实现

import java.util.Scanner;

/**
 * 输出单向链表中倒数第k个结点
 */
class ListNode {

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

public class HJ51 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int line = scanner.nextInt();
            ListNode head = new ListNode(-1);
            ListNode temp = head;
            //生成链表
            for (int i = 0; i < line; i++) {
                ListNode node = new ListNode(scanner.nextInt());
                temp.next = node;
                temp = temp.next;
            }
            int k = Integer.parseInt(scanner.next());
            if(getKthFromEnd(head.next,k) != null){
                System.out.println(getKthFromEnd(head.next,k).val);
            }
            else{
                System.out.println(0);
            }
        }
    }

    public static ListNode getKthFromEnd(ListNode head, int k) {
        int n = 0;
        ListNode node = null;
        //记录有多少节点
        for (node = head; node != null; node = node.next) {
            n++;
        }
        //找倒数第k个
        for (node = head; n > k; n--) {
            node = node.next;
        }
        return node;
    }
}

你可能感兴趣的:(华为机试,数据结构,java,算法)