题解 | #输出单向链表中倒数第k个结点#

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

https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        String a;
        StringBuffer string = new StringBuffer();
        char[] chs;
        int[] linked;
        int n, i, j = 0, k = 0, tmp, l;
        try {
            while ((a = r.readLine()) != null && !a.isEmpty()) {
                chs = a.toCharArray();
                l = chs.length;
                i = 0;
                n = 0;
                while (i < l) {//有多少节点
                    n *= 10;
                    n += chs[i] - '0';
                    i++;
                }
                linked = new int[n];//初始化节点数组
                a = r.readLine();
                chs = a.toCharArray();
                l = chs.length;
                i = 0;
                j = 0;
                k = 0;
                tmp = 0;
                while (i < l) {//获得节点值
                    if (chs[i] == ' ') {
                        if (k > 0) linked[j++] = tmp;
                        tmp = 0;
                        k = 0;
                        i++;
                        continue;
                    }
                    k++;
                    tmp *= 10;
                    tmp += chs[i] - '0';
                    if (i == l - 1) linked[j] = tmp;
                    i++;
                }
                a = r.readLine();
                chs = a.toCharArray();
                l = chs.length;
                i = 0;
                k = 0;
                while (i < l) {//倒数第几个节点
                    k *= 10;
                    k += chs[i] - '0';
                    i++;
                }
                i = 1;
                l = linked.length;
                LinkedNode head = new LinkedNode(linked[0]);
                LinkedNode point = head;
                while (i < l) {//链表赋值
                    LinkedNode node = new LinkedNode(linked[i]);
                    point.next = node;
                    point = node;
                    i++;
                }
                LinkedNode nodeK = twoPoint(head, k);
                string.append(nodeK == null ? 0 :
                              nodeK.value).append("\n");//如果为空,输出0
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.print(string);
    }

//快慢指针先后遍历链表,快指针先行k步
    private static LinkedNode twoPoint(LinkedNode head, int rec) {
        int i = 0;
        LinkedNode quick = head;
        LinkedNode slow = head;
        LinkedNode node;
        while (i < rec) {
            if (quick != null) {
                node = quick.next;
                quick = node;
                i++;
            } else {
                slow = null;
                break;
            }
        }
        while (quick != null) {
            node = quick.next;
            quick = node;
            node = slow.next;
            slow = node;
        }
        return slow;
    }
}

class LinkedNode {
    int value;
    LinkedNode next;

    public LinkedNode(int value) {
        this.value = value;
        this.next = null;
    }
}

全部评论

相关推荐

求面试求offer啊啊啊啊:这个在牛客不是老熟人了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务