輸出單向鏈表中倒數第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;

/**
 * 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;
        }
    }
}
相關文章
相關標籤/搜索