运用双指针查找链表倒数第K个节点

运用双指针查找链表第K个节点
双指针算法顾名思义就是运用两个指针搭配进行运算,此次的内容主要介绍的是解决链表问题常用到的快慢指针。
核心思想:先初始化两个指针且指向链表的头结点,然后让快指针先走K步,之后快慢指针同时前进。这样运行后,当快指针走到链表的末尾NULL时,慢指针正好指向倒数第K个节点。
下面是双指针的代码:

int Search_K(Linklist *h, int k)
{
    Linklist *p = h->next;	
 	Linklist *q = h->next;
 	int count = 0;            //  计数器
 	
	while(p!=NULL)
	{
		if(count<k)
			count++;		
		else	
			q = q->next;	
		p = p->next;		
	 } 	 
	if(count < k)       //如果K大于链表的长度情况 
	{
		printf("您要查找的节点不存在!"); 
		return 0;
	}
	else
	{
		printf("倒数第%d个节点的数据为:%d\n",k,q->num);
		printf("*** 查找完成!***"); 
		return 1;
	}
}

接下来就是整体的代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct LinkNode
{
	int num;
	LinkNode *next;
}Linklist;

Linklist * creat_linklist();       //尾插法创建含有头结点的单链表
int Search_K(Linklist *h, int k);  //双指针算法查找节点

int main()
{
	int k;
	Linklist *head;
	printf("请输入要查找的倒数第几个节点:"); 
	scanf("%d",&k); 
	head = (Linklist *)malloc(sizeof(Linklist));
	head = creat_linklist();
	Search_K(head,k);
	
	return 0;
 }

Linklist * creat_linklist()
{
	int n,t=1;
	Linklist *h,*p,*q;
	h = q =(Linklist *)malloc(sizeof(Linklist));
	
	printf("请开始进行数据录入:\n");
	printf("请输入第%d个数据:",t); 
	scanf("%d",&n);
	
	while(n!=-1)
	{
		p = (Linklist *)malloc(sizeof(Linklist)); 
		p->num = n;
		q->next = p;
		q = p;
		t++;
		printf("请输入第%d个数据:",t);
		scanf("%d",&n); 	
	}
	q->next = NULL;
	return h;	
 } 
 
int Search_K(Linklist *h, int k)
{
    Linklist *p = h->next;	
 	Linklist *q = h->next;
 	int count = 0;            //  计数器
 	
	while(p!=NULL)
	{
		if(count<k)
			count++;		
		else	
			q = q->next;	
		p = p->next;		
	 } 	 
	if(count < k)       //如果K大于链表的长度情况 
	{
		printf("您要查找的节点不存在!"); 
		return 0;
	}
	else
	{
		printf("倒数第%d个节点的数据为:%d\n",k,q->num);
		printf("*** 查找完成!***"); 
		return 1;
	}
}  
 
 

运行结果示例:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值