描述
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针
本题有多组样例输入。
输入描述:
输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值
输出描述:
输出一个整数
示例:
输入: 8 1 2 3 4 5 6 7 8 4 输出: 5
解法
此题考查如何链表数据结构的操作。Java API提供了LinkedList结构,但显然直接用这个结构未免显得无法彰显技术功底。因此,需要自己实现一个链表数据。
单向链表是一种线性表,实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置。由N各节点(Node)组成单向链表,每一个Node记录本Node的数据及下一个Node。向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。
有关链表数据结构的实现,可以参考 《数据结构和算法基础(Java 语言实现)》这本书,里面有详细的介绍。本题只是实现了链表的最基础的功能,直接看代码:
/*
* Copyright (c) waylau.com, 2022. All rights reserved.
*/
package com.waylau.nowcoder.exam.oj.huawei;
import java.util.Scanner;
/**
* HJ51 输出单向链表中倒数第k个结点.
* 描述:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
* 正常返回倒数第k个结点指针,异常返回空指针
* 输入描述:
* 输入说明
* 1 输入链表结点个数
* 2 输入链表的值
* 3 输入k的值
* 输出描述:
* 输出一个整数
* 示例:
* 输入:
* 8
* 1 2 3 4 5 6 7 8
* 4
* 输出:
* 5
*
* @author <a href="">Way Lau</a>
* @since 2022-08-26
*/
public class HJ051OutputTheKthToLastNodeInTheUnidirectionalLinkedList {
public static void main(String[] args) {
// 输入
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
int n = in.nextInt();
MyLinkedList list = new MyLinkedList();
for (int i = 0; i< n;i++) {
list.add(in.nextInt());
}
int k = in.nextInt();
// 输出
System.out.println(list.get(n - k));
}
// 关闭
in.close();
}
}
class Node {
public int data;
public Node next;
public Node(int data) {
this.data = data;
}
}
class MyLinkedList {
// 实际链表里面的元素个数
private int size = 0;
// 头节点
private Node first;
// 尾节点
private Node last;
public MyLinkedList() {
}
public boolean add(int e) {
final Node l = last;
// 构造一个新节点
final Node newNode = new Node (e);
last = newNode;
// 判断尾节点,尾节点为null,则证明链表是空的。
// 如果链表是空的,新增加的节点就作为头结点;
// 如果链表是不空,则原尾节点的next指向新增加的节点
if (l == null) {
first = newNode;
last = newNode;
} else {
l.next = newNode;
}
size++; // size累加1位
return true;
}
public int get(int index) {
// 判断是否越界
if (index < 0 || index > size - 1) {
throw new IndexOutOfBoundsException(
"index " + index + " out of bounds");
}
Node x = first;
// 遍历链表
for (int i = 0; i < index; i++) {
x = x.next;
}
return x.data;
}
}
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html

京公网安备 11010502036488号