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

【华为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;
        }
    }
}

你可能感兴趣的:(华为OJ,华为OJ)