【华为OJ】【035-输出单向链表中倒数第k个结点】

来源:互联网 发布:违反交通淘宝 编辑:程序博客网 时间:2024/06/05 23:55

【华为OJ】【算法总篇章】


【华为OJ】【035-输出单向链表中倒数第k个结点】

【工程下载】


题目描述

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

输入描述

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

输出描述

输出一个整数

输入例子

8 1 2 3 4 5 6 7 8 4

输出例子

4

算法实现

import org.omg.SendingContext.RunTime;import java.util.List;import java.util.Scanner;/** * Author: 王俊超 * Date: 2015-12-24 16:10 * All Rights Reserved !!! */public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));        while (scanner.hasNext()) {            int n = scanner.nextInt();            ListNode head = new ListNode(0);            ListNode prev = head;            while ((--n) >= 0) {                prev.next = new ListNode(scanner.nextInt());                prev = prev.next;            }            int k = scanner.nextInt();            System.out.println(findKthToTail(head, k));        }        scanner.close();    }    /**     * 找倒数第k个结点,假设k是有效的     *     * @param head     * @param k     * @return     */    private static ListNode findKthToTail(ListNode head, int k) {        ListNode prev = head;        while (--k >= 0 && prev != null) {            prev = prev.next;        }        // 说明k已经超出了链表的长度        if (prev == null) {            throw new RuntimeException("k=" + k + "不合法");        }        // 注释掉的才是正确答案//        while (prev != null) {//            prev = prev.next;//            head = head.next;//        }        // 如果从0开始,即链表尾部第一个是倒数第0个那么下面是正确的        while (prev.next != null) {            prev = prev.next;            head = head.next;        }        return head;    }    private static class ListNode {        int v;        ListNode next;        ListNode(int v) {            this.v = v;        }        @Override        public String toString() {            return "" + v;        }    }}
3 0
原创粉丝点击