输出单向链表中倒数第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;
        }
    }
}

转载于:https://my.oschina.net/u/2822116/blog/819203

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值