快速寻找单链表中间元素结点

这篇博客探讨了一种使用双指针技术快速找到单链表中间元素节点的方法,避免了两次循环遍历链表的时间消耗。通过设置移动速度为2倍的指针和普通指针,当快指针到达链表末尾时,慢指针恰好位于中间位置。
摘要由CSDN通过智能技术生成

忘记什么时候做的笔试题了。记忆力差没办法。

一看到这倒题目,下意识的想到的解决方案便是首先循环遍历链表获得链表长度Len,然后再次循环遍历链表查找Len/2处的中间节点。在这种情况下,其时间复杂度由两次循环决定:O(L+L/2)=O(3L/2)。

尽管这种思路也能解决问题,但也许存在更好的方法。上次我们谈到利用双指针来寻找链表中倒数第N个元素结点,现在我们同样也可以利用双指针来查找中间节点:

设置两个指针*search,*mid,初始时,都指向头结点。其中*search的移动速度为*mid的两倍。类比物理中的匀速运动,相同时间内,*search经过的结点应该是*mid结点个数的2倍,也就说,当*search结点到达链表终点时,*mid在链表中间结点处。

下面放上代码实现:

#include<stdlib.h>
#include<string.h>
#include<stdio.h>

typedef int elemType;
typedef struct Node{//定义链接节点
	elemType element;
	Node* next;
}Node;
int insertLast(Node** pNode, elemType ele);
//1、初始化链表,未带头结点
void init(Node** pNode){
	*pNode = NULL;
	printf("------>链表初始化<------\n");
}

void init_n(Node** pNode){
	*pNode = (Node*)malloc(sizeof(Node));//产生头结点,并使pNode头指针指向头结点
	if (!(*pNode)){
		printf("头结点初始化空间失败\n");
	}
	printf("------>链表初始化<------\n");
	(*pNode)->next = NULL;
}
//1、创建链表
Node* create(Node* pHead){
	Node* p1;//代表新节点
	Node * p2;//代表尾节点
	p1 = p2 = (Node*)malloc(sizeof(Node));//申请节点
	if (p1 == NULL || p2 == NULL){
		printf("内存空间申请失败\n&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值