数据结构与算法7——单链表小结(腾讯面试题)

这篇博客讨论了如何在面试中解答寻找未知长度单链表中间结点的问题。首先介绍了简单方法,即遍历两次链表,算法复杂度为O(3L/2)。接着提出优化方案,使用快慢指针,快指针移动速度是慢指针的2倍,当快指针到达末尾时,慢指针位于中间。提供了实现代码,并分享了编写链表代码时遇到的节点定义和类型匹配问题。
摘要由CSDN通过智能技术生成

题目:快速找到未知长度单链表的中间结点。

既然是面试题就一定有普通方法和高级方法,而高级方法无疑会让面试官大大加分!

普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头结点出发循环L/2次找到单链表的中间结点。

算法复杂度为:O(L+L/2)=O(3L/2)。

能否再优化呢?有一个很巧的方法:利用快慢指针

利用快慢指针原理:设置两个指针*search、 *mid 都指向单链表的头结点。其中 *search 的移动速度是 *mid 的2倍。当 *search 指向末尾结点的时候,*mid 正好就在中间了。

实现代码:
GetMidNode.c

int GetMidNode( LinkList L ,ElemType *e )
{
	LinkList search,mid;
	mid = search = L;
	
	while( search->next != NULL )
	{
		if( search->next->next != NULL ) 
		{
			search = search->next-next;
			mid = mid->next;
		}
		else
		{
			search = search->next;
		}
	}
	*e = mid->data;
	return 1;
}

接下来就写一个完整的代码:实现随机生成20个元素的链表(尾插法或者头插法任意),用我们刚才学到的方法快速查找中间结点的值并且显示。

#include <stdio.h>
#include <stdlib.h>
#incl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值