快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。
快慢指针的应用
判断单链表是否为循环链表
fast=slow=head;
fast=fast->next->next;
slow=slow->next;
while(true)
{
if (fast==NULL || fast->next==NULL)
return false;
else if (fast==slow || fast->next==slow)
return true;
else
{
fast=fast->next->next;
slow=slow->next;
}
}
在链表中寻找中位数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct node
{
int num;
struct node *next;
}Node;
typedef Node *Link;
void init_head(Link *head)//初始化表头
{
*head = (Link)malloc(sizeof(Node));
(*head)->next = NULL;
}
void create_list(Link *head)//尾插法创建链表
{
int i;
Link newnode;
Link r;
r = *head;
srand((unsigned)time(NULL));//根据系统时间产生种子
for(i = 0;i < 7;i ++)
{
newnode = (Link)malloc(sizeof(Node));
newnode->num = rand() % 100;//获取1到99的整数
r->next = newnode;
r = newnode;
}
}
void display(Link *head)//打印链表内容
{
Link temp;
temp = (*head)->next;
while(temp != NULL)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
//用快慢指针获取链表中间值方法一
void getmid(Link *head,int *e)
{
Link temp = (*head)->next;
Link front;
Link back;
front = back = temp;
while(front->next != NULL)
{
if(front->next->next != NULL)
{
front = front->next->next;
back = back->next;
}
else
{
front = front->next;
}
}
*e = back->num;
}
//用快慢指针获取链表中间值方法二
void getmid1(Link *head,int *e)
{
Link temp = (*head)->next;
Link fast = temp->next;
Link slow = temp;
while(fast != NULL)
{
fast = fast->next;
if(fast != NULL)
{
fast = fast->next;
slow = slow->next;
}
}
*e = slow->num;
}
int main()
{
Link head;
int e;
init_head(&head);
create_list(&head);
display(&head);
//getmid(&head,&e);
getmid1(&head,&e);
printf("%d\n",e);
return 0;
}
编译及运行结果如下:
[root@bogon 0729]# gcc front_back.c &&./a.out
25
31
66
34
45
6
66
34