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

package com.itcast.demo.ListNode;


import java.util.Scanner;

public class ListNodeDemo<E> {

	public static void main(String[] args) {
		ListNodeDemo knode = new ListNodeDemo();
		System.out.println("请随意输入一串数字:");
		Scanner sc = new Scanner(System.in);
		String[] a = sc.nextLine().split(" ");// 构造数据源
		System.out.println("请随意输入K的值:");
		int k = sc.nextInt(); // k的范围[0,a.length-1] ,此处略去了审查
		knode.printResult(knode, a, k);
	}

	// 打印结果
	private void printResult(ListNodeDemo knode, E[] e, int k) {
		// 1)创建一个除头节点外有num个节点的单链表,
		int length = e.length;
		Node first = knode.createList(e);
		Node q = knode.KNode(first, k); // 2)找到倒数第k个节点
		System.out.println("这是单链表:");
		for (int i = 0; i < length - 1; i++) {
			System.out.print(first.next.data + "-->");
			first = first.next;
		}
		System.out.print(first.next.data);
		System.out.println("\n这是单链表的倒数第" + k + "个元素:" + q.data);
	}

	// 输出该链表中倒数第k个结点
	private Node KNode(Node first, int k) {
		int n = -1; // n保存节点的个数,从正向计数,节点下标为[0,n],即总共有n+1个真正节点
		Node r = first;
		while (r.next != null) { // 创建一个循环单链表,尾指针指向first.next
			r = r.next;
			n++;
		}
		Node q = first;// q指向倒数第k个节点,倒数第k个节点即为正数第n-k个节点
		int t = n - k;
		while (t >= 0) {
			q = q.next;
			t--;
		}
		return q;
	}

	// 创建带头节点的无环单链表,真正的节点有m个
	public Node createList(E[] keys) {
		Node first = new Node(null, null); // 头节点
		Node r = first; // 指向链表的尾节点
		for (E e : keys) { // 产生0~100之间数字
			Node node = new Node(e, null);
			r.next = node;
			r = node;
		}
		r.next = null; // 若是构建无环单链表,此处 r.next = null;
		return first;
	}
}

class Node<E> {
	public E data;
	public Node next;

	public Node(E data, Node next) {
		super();
		this.data = data;
		this.next = next;
	}
}



结果:

请随意输入一串数字:
1 2 6 85 98 74 4 5 
请随意输入K的值:
5
这是单链表:
1-->2-->6-->85-->98-->74-->4-->5
这是单链表的倒数第5个元素:6


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DisFney

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值