九度OJ-题目1517:链表中倒数第k个结点

题目链接地址:

九度OJ-题目1517:链表中倒数第k个结点


题目描述:
输入一个链表,输出该链表中倒数第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


解题思路:

这道题我是参考网上的解法做的,大概思路是:先用一个指针p1指向链表中的第k个结点,然后让指针p2从头结点出发去"追赶"p1指针,每"追赶"一次,p1和p2指针都向右移动一个位置,当p1指针指向链表中最后一个元素的下一个位置时,p2指向的就是当前链表中的倒数第k个结点。需要注意的是链表中倒数第0个结点并不是链表的最后一个结点,而是链表中最后一个结点所指向的下一个结点,也就是NULL。

AC代码如下:

#include<stdio.h>
#include<malloc.h>
 
// 构造链表结点
typedef struct LNode
{
  int data;       // 数据域
  LNode * next;   // 指针域
}LinkList;
 
/**
* 创建一个单链表
* @param n  表示单链表中结点数目
* @return head  单链表的头指针
*/
LinkList * createLinkList(int n)
{
    LinkList * head = (LinkList *)malloc(sizeof(LinkList));  // 构造链表的头结点
    head -> next = NULL;
    LinkList * p = head;        // p始终指向链表中的最后一个结点
    int i;
    int data;
    for(i = 1;i <= n;i++)
    {
      LinkList * s = (LinkList *)malloc(sizeof(LinkList));
      scanf("%d",&data);
      s -> data = data;
      s -> next = p -> next;
      p -> next = s;            // 将s结点插入到p结点的后面
      p = s;
    }
    return head;
}
 
/**
* 输出链表中倒数第k个结点
* 先用一个指针p1指向链表中的第k个结点;
* 然后让指针p2从头结点出发去"追赶"p1指针;
* 每"追赶"一次,p1和p2指针都向右移动一个位置
* 当p1指针指向链表中最后一个元素的下一个位置时,p2指向的就是当前链表中的倒数第k个结点
* @param head  链表的头指针
* @param k  该链表中倒数第k个结点
* @return void
*/
void printBackwordsNInLinklist(LinkList * head,int k)
{
  int i = 1;                          // 注意i的初始值是1,不是0
  LinkList * p1 = head;
  // 先将p1指针指向链表中的第k个结点
  while((p1 != NULL) &&(i <= k))
  {
      p1 = p1 -> next;
      i++;
  }
  if(NULL == p1)                    // 当 k > n(n为链表中的结点个数)时的情况
  {
      printf("NULL\n");
  }
  else
  {
      LinkList * p2 = head;  // p2指针从链表头结点开始去追赶p1指针
      while(p1 != NULL)
      {
          p1 = p1 -> next;
          p2 = p2 -> next;
      }
      if(NULL == p2)         // 当k == 0时的情况
      {
          printf("NULL\n");
      }
      else                   // 当p1指向链表的最后一个结点的next(p1 == NULL)时,p2刚好指向链表的倒数第k个结点
      {
          printf("%d\n",p2 -> data);
      }
  }
}
 
int main()
{
    int n,k;
    LinkList * head;
    while(EOF != scanf("%d%d",&n,&k))
    {
       head = createLinkList(n);
       printBackwordsNInLinklist(head,k);
    }
    return 0;
}
 
/**************************************************************
    Problem: 1517
    User: blueshell
    Language: C++
    Result: Accepted
    Time:100 ms
    Memory:2604 kb
****************************************************************/


你可能感兴趣的:(面试题,剑指offer)