链表中倒数第k个结点:online judge
题目描述:
-
输入一个链表,输出该链表中倒数第k个结点。
(hint: 请务必使用链表。)
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素。
输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素。
输入:
-
对应每个测试案例,
若有结果,输出相应的查找结果。否则,输出NULL。
输出:
-
5 2 1 2 3 4 5 1 0 5
样例输入:
-
4 NULL
样例输出:
解题思路:
本题的解题思路相对比较简单,采用两个指针指向链表的表。第一个指针先向后移动k个位置,然后两个指针同时向后移动,直到第一个指针移动到链表末尾,第二个指针所指的位置就是倒数第K个结点的位置。
java代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.LinkedList;
import java.util.Scanner;
public class Problem_15 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while( in.hasNext()){
int n = in.nextInt();
int k = in.nextInt();
if(k>n || k <= 0 || n <=0){
for(int i = 0; i < n; i++){
in.next();
}
System.out.println("NULL");
}else{
Link root = new Link(in.nextInt());
Link pre = root;
for(int i = 1; i < n; i++ ){
Link temp = new Link(in.nextInt());
pre.next = temp;
pre = temp;
}//end for
Link fast = root;
Link slow = root;
for(int i = 0; i< k; i++){
fast = fast.next;
}//end for
while(fast != null){
fast= fast.next;
slow = slow.next;
}//end while
System.out.println(slow.value);
}//end if
} //end while
}
}
C++代码:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <memory.h>
#include <string>
#include <algorithm>
#include<iomanip>
#include <map>
#include <fstream>
#include <stack>
using namespace std;
struct node
{
int value;
node *next;
node(int val)
{
value = val;
next = NULL;
}
};
void process(node *root, int k)
{
node *p = root;
node *q = root;
k --;
if(k < 0)
{
printf("NULL\n");
return;
}
while(k-- > 0 && q->next != NULL)
{
q = q->next;
}
while(q->next != NULL)
{
p = p->next;
q = q->next;
}
printf("%d\n", p->value);
}
int main() {
int n, m, t;
while(scanf("%d %d",&n, &m) != EOF)
{
node *root = NULL;
node *tmp = NULL;
t = n;
int x;
node *pre;
while(t-- > 0)
{
scanf("%d",&x);
tmp = new node(x);
if(root == NULL)
{
pre = tmp;
root = tmp;
}
else
{
pre->next = tmp;
pre = tmp;
}
}
if(m > n || n == 0)
{
printf("NULL\n"); continue;
}
process(root, m);
}
return 0;
}
C代码:
#include <stdio.h>
int main(void)
{
int n,k;
int i,j;
int *p;
while(scanf("%d %d",&n,&k) != EOF)
{
p = (int *)malloc(n * sizeof(int));
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
if(k == 0 || k > n || k < 0)
{
printf("NULL\n");
continue;
}
for(i=0;i<k-1;i++);
for(j=0;i<n-1;i++,j++);
printf("%d\n",*(p+j));
free(p);
}
}
测试用例:
功能测试:第K个结点在链表中间,第K个结点是链表的头结点
特殊输入测试:链表为空,总结点数少于K个,K等于0等情况
体会:
这一篇文章主要的也是考察编程者思维的严谨性,解题思路与前一篇博客《调整数组顺序使奇数位于偶数前面》差不多。这两个面试题都是考察编程者思维的严谨性,所写代码的鲁棒性。