运用双指针查找链表第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;
}
}
运行结果示例: