腾讯面试题:快速找到单链表中间结点

方法一:普通方法
在这里插入图片描述

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

//声明结点
typedef struct nodew
{
	char data;
	struct node* next;
} LinkList;

//尾插法建立单链表
LinkList *CreateLinkR();
//求单链表长度
int Length(LinkList *head);
//读取L/2位置的元素
char GetHalf(LinkList *head, int L);

int main()
{
	LinkList *head;
	int L;				//L:链表长度
	char ch;			//中间结点的值
	head = CreateLinkR();		//尾插法建立单链表
	L = Length(head);
	
	ch=GetHalf(head,L);
	printf("%c", ch);
}

LinkList *CreateLinkR()
{
	LinkList *head, *p,*r; 
	char ch;
	head = (LinkList*)malloc(sizeof(LinkList));
	head->next = NULL;
	r = head;
	while ((ch = getchar()) != '\n')
	{	
		p= (LinkList*)malloc(sizeof(LinkList));
		p->data = ch;
		r->next = p;
		r = p;
	}
	r->next = NULL;
	return head;
}
int Length(LinkList *head)
{
	int L=1;			//计数器L
	LinkList *p;
	p = head->next;
	while (p->next)
	{
		L++;
		p = p->next;
	}
	return L;

}
char GetHalf(LinkList *head,int L)
{
	int i = 1;
	LinkList *p;
	p = head->next;
	while (p->next&&i!=L/2+1)
	{
		i++;
		p = p->next;
		
		}
		
	return p->data;
}

方法二:快慢指针
在这里插入图片描述

char GetHalf(LinkList *head,int L)
{

	LinkList *mid,*search;
	mid = head->next; search = head->next;
	while (search->next!= NULL)    //*search指到最后一个结点,跳出循环
	{	
		if (search->next->next != NULL)      //快慢指针
		{
			mid = mid->next;
			search = search->next->next;
		}
		else		  //保证search移动到最后一个结点
			search = search->next;
		}
		
	return mid->data;    		//返回中间结点的值
}
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值