原理:例如 给定 数列 1 2 3 4 5 6
第一步:定义:pre=1 ,pcur=1 两者同时指向第一个元素
第二步:通过 循环 让 pcur=4 指向第四个元素 ,即让pre和pcur两者保持固定间隔
第三步:此时 判断出pcur=4, 让pre =2, 即让pre往后移动一位,
第五步 pre 移动后 pcur 也要往后移动一位 ,即pcur=5
最后 pcur=6 走到链表尾部 ,pre=3 指向该链表的倒数第四个元素
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct NUM {//定义一个结构体
int num;
struct NUM* pNext;
} num, * pnum;
//该子函数 是尾插法
void insert(pnum* phead, pnum* ptail, int Input) {
pnum pnew = (pnum)calloc(sizeof(num), 1);
memset(pnew, 0, sizeof(num));
pnew->num = Input;
if (NULL == *phead) { //判断链表是否为空
//如果链表为空
*phead = pnew;
*ptail = pnew;
}
else if (Input <= (*phead)->num) {
(*ptail)->pNext = pnew;
*ptail = pnew;
}
}
//该子函数 是打印输出结果
void print(pnum *phead) {
pnum pcur = phead;
while (pcur) {
printf("%d",pcur->num);
pcur = pcur->pNext;
}
printf("\n");
}
//该子函数 是计算链表的长度
int count_List(pnum phead) {
int count = 0;
pnum pcur = phead;
while (pcur) {
++count;
pcur = pcur->pNext;
}
return count;
}
int main() {
pnum phead = NULL;
pnum ptail = NULL;
pnum pre = NULL;
pnum pcur = NULL;
pnum r= NULL;//定义头指针
int InPut;//定义要输入的数
int len=0;
int x = 1;
while (scanf_s("%d", &InPut) != EOF) {
insert(&phead,&ptail,InPut);//调用子函数 在子函数中具体实现功能
}
len = count_List(phead);//判断链表长度
if (len < 4) {
printf("该链表的长度小于4\n");
}
else {
pre = pcur = phead;
}
while (pcur->pNext) {
if (x>=4) {
pre = pre->pNext;
}
pcur = pcur->pNext;
x++;
}
printf("链表倒数第四个元素是:%d\n",pre->num);
}
运行结果: