设head指向一个非空单向链表,返回倒数第k个结点的值(C语言实现)。
思路:首先非空的单向链表我们不考虑链表为空的情况,返回倒数第K个结点,我们假设有两个指针,两个指针指的位置相差K个位置,当有一个指针跑到NULL时,另一个指针则为倒数第k个位置,及设有p,q两个指针,k=2,则q=h,p->next->next,当p不为NULL时,两指针往前跑,p为NULL停,q所指位置为倒数第k(k=2)个位置。
下面为具体实现代码
运行环境VS2017
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int date;
struct node*next;
}ElemSN;
//创建链表
ElemSN*GreatLink(int Date[], int n)
{
int i;
ElemSN*p, *t = 0, *h = 0;
for (i = 0;i < n;i++)
{
p = (ElemSN*)malloc(sizeof(ElemSN));
p->date = Date[i];
p->next = NULL;
if (!h)
h = t = p;
else
t = t->next = p;
}
return h;
}
//输出链表
PrintLink(ElemSN*h)
{
ElemSN*p;
for (p = h;p;p = p->next)
printf("%3d", p->date);
printf("\n");
}
ElemSN* ReturnNode(ElemSN*h, int k)
{
int i = 0;
ElemSN*p=h,*q;
for (i = 0;i < k;i++)//将p往前跑k个
p = p->next;
for (q = h;p;p = p->next)
{
q = q->next;
}
return q;
}
int main(void)
{
int a[6] = { 3,2,5,8,4,7 };
int k = 3;
ElemSN*head,*t;
head = GreatLink(a, 6);
PrintLink(head);
t=ReturnNode(head, k);
printf("%d\n", t->date);
system("pause");
}
输出结果:
3 2 5 8 4 7
8