问题描述:
在单链表中寻找倒数第k个元素。
思路分析:
大致有两条思路。
(1)先遍历一次链表,得到其长度size,然后正序遍历到size-k+1个,即是所要寻找的元素。
(2)利用快行指针。建立两个指针解决,并且将两个指针的差值定位k,不断向后移动,前面的指针所指的元素即为所要寻找的元素。
我们实现第二种思路。具体见代码注释:
package List;
import java.util.Scanner;
class Node{
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
public class LastK {
//寻找倒数第k个结点(快行指针)
public static int find(Node first,int k)
{
Node p=first.next;//定义两个指针
Node p1=first;
int count=1;//判断差值为k时进行同时移动
int res=0;//结果记录
while (p!=null)
{
if (count==k)//两指针的差值为k
{
while (p!=null)
{
p=p.next;
p1=p1.next;
}
res=p1.data;
break;
}
p=p.next;
count++;
}
return res;//结果返回
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int len = scanner.nextInt();//输入数组的长度
int k = scanner.nextInt();//输入要删除的k
int[] a = new int[len];
for (int i = 0; i < len; i++) {
a[i] = scanner.nextInt();
}
Node first = new Node(-1);//哑元
Node p = first;
for (int i = 0; i < len; i++) {//数组转链表
p.next = new Node(a[i]);
p = p.next;
}
//此段代码用于检测数组转链表是否正确
// Node p1=first.next;
// while (p1!=null)
// {
// System.out.println(p1.data);
// p1=p1.next;
// }
if (k > len||k<0) {
System.out.println("k值不规范");
} else {
int res = find(first, k);
System.out.println(res);//输出倒数第k个元素
}
}
}
运行结果如下: