快慢指针应用(一)

快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。

快慢指针的应用

判断单链表是否为循环链表

让快慢指针从链表头开始 遍历,快指针向前移动两个位置,慢指针向前移动一个位置;如果快指针到达NULL,说明 链表以NULL为结尾,不是 循环链表。如果 快指针追上慢指针,则表示出现了循环。
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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值