20. 【C语言】在不涉及统计链表结点数的情况下,找出单链表倒数第n个结点(5_task)

问题描述:
在不涉及统计链表结点数的情况下,找出单链表倒数第n个结点。当然n的值绝不会超过链表长度。

算法思想:
初始化两个结点指针,ppre和pcur,并且都指向头指针。用一个循环将结点指针pcur向后偏移n-1个结点位置。此时ppre指向链表的第一个结点的位置,pcur指向链表第n个结点的位置。再用一个循环控制ppre和pcur两个指针的偏移。ppre向后偏移一个结点位置,同时pcur也向后偏移一个结点的位置。当pcur指向尾结点时,此时ppre就指向链表倒数第n个结点的位置。两个指针运动轨迹逻辑图如下:
在这里插入图片描述
案例运行效果:
在这里插入图片描述
完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#define N 4
typedef struct linklist {
	int data;
	struct linklist *next;
}list,*plist;
void list_create(plist *pphead, plist*pptail, int key)		//创建链表
{
	plist pnew = (plist)calloc(1, sizeof(list));
	pnew->data = key;
	if (NULL == (*pphead))
	{
		*pphead = pnew;
		*pptail = pnew;
	}
	else {
		(*pptail)->next = pnew;
		*pptail = pnew;
	}
}
void search_node(plist phead, plist ptail)
{
	plist ppre=phead, pcur = phead;
	int count = N-1;
	while (count > 0)
	{
		pcur = pcur->next;
		count--;
	}
	while (pcur->next)
	{
		ppre = ppre->next;
		pcur = pcur->next;
	}
	printf("链表倒数第%d个结点为%d\n",N, ppre->data);
}
int main()
{
	plist phead = NULL, ptail = NULL;
	int key;
	while (scanf("%d", &key) != EOF)
	{
		list_create(&phead, &ptail, key);
	}
	search_node(phead, ptail);
	system("pause");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值