题目:输入一个链表,输出该链表中倒数第k个节点。
分析:一个快指针,一个慢指针,快指针和慢指针之间差k-1个节点,快指针到尾部,慢指针指向的节点即是所找节点。
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int value;
struct node *next;
}node,*pnode;
void create_list(pnode *head)
{
pnode p,q;
int i;
for(i=1;i<10;i++)
{
if(i==1)
{
p = (pnode)malloc(sizeof(node));
if(!p)
return;
p->value = i;
p->next = NULL;
*head = p;
q = p;
}
else
{
p = (pnode)malloc(sizeof(node));
if(!p)
return;
p->value = i;
p->next = NULL;
q->next = p;
q = p;
}
}
p = *head;
printf("创建节点为:\n");
while(p)
{
printf("%d\t",p->value);
p = p->next;
}
printf("\n");
}
void find_node(pnode head, int k)
{
if(head==NULL || k<=0)
return;
pnode ahead = head;
pnode behind = NULL;
int i;
for(i=0;i<k-1;i++)//ahead和behind之间差k-1个节点
{
if(ahead->next != NULL)//判断k是否超过链表长度
ahead = ahead->next;
else
{
printf("k值超过链表长度!\n");
return;
}
}
behind = head;
while(ahead->next!=NULL)
{
ahead = ahead->next;
behind = behind->next;
}
printf("倒数第%d个节点为:%d\n",k,behind->value);
}
int main()
{
pnode head = NULL;
create_list(&head);
int k;
printf("输入k值:\n");
scanf("%d",&k);
find_node(head,k);
return 0;
}