题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点。
考察点:代码的鲁棒性,如k大于结点数
源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}*LinkList;
void create_list(LinkList &L,int &n){
LinkList p,q;
int e;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
q=L;
printf("输入链表序列,以0结束:");
scanf("%d",&e);
while(e)
{
n++;
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
p->next=NULL;
q->next=p;
q=q->next;
scanf("%d",&e);
}
}
void list_traverse(LinkList L)
{
while(L->next!=NULL)
{
printf("%d ",L->next->data);
L=L->next;
}
}
void DeleteNode(LinkList &L,int w)
{
LinkList p,q;
p=L;q=L->next;
while(--w)
{
p=p->next;
q=q->next;
}
p->next=q->next;
free(q);
}
void main()
{
LinkList L;
int n=0;
create_list(L,n);
int m;
printf("删除倒数结点的位置:");
scanf("%d",&m);
if(m>n)
printf("溢出");
else
{
printf("删除后遍历:");
DeleteNode(L,n-m+1);
list_traverse(L);
}
}
结果:
输入链表序列,以0结束:1 2 3 4 5 6 0
删除倒数结点的位置:3
删除后遍历:1 2 3 5 6