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

81 阅读1分钟
    ## 题目描述

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

链表结点定义如下:

```c++
struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};
```

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

**要求:**

**(1)正序构建链表;**

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

数据范围:链表长度满足 1 \le n \le 1000 \1≤*n*≤1000 , k \le n *k*≤*n* ,链表中数据满足 0 \le val \le 10000 \0≤*v**a**l*≤10000 

本题有多组样例输入。

> 题目来源

[题目来源](https://www.nowcoder.com/practice/e45e078701ab4e4cb49393ae30f1bb04?tpId=37&tqId=21235&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=)

## 输入描述

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

### **输出描述:**

输出一个整数

```c
输入:	8
	  1 2 3 4 5 6 7 8
	  4
输出:
	  5
```

## 思路



## 具体实现

`import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
           Node head = new Node(-1);
           Node temp = head;
            //生成链表
            for (int i = 0; i < n; i++) {
                Node node = new Node(sc.nextInt());
                temp.next = node;
                temp = temp.next;
            }
            int k = sc.nextInt();
            if(get(head.next,k) != null){
                System.out.println(get(head.next,k).val);
            }
            else{
                System.out.println(0);
            }

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

        return node;
    }
}

class Node {
    Node next;
    int val;
   Node(int val) {
        this.val = val;
        next = null;
    }
}`

## 时间复杂度

- O(n)

## 小结