查找单链表的中间节点,要求只能遍历一次链表

  今天写的函数是查找单链表中的中间节点,但是要求只能遍历一遍,如果不是这个条件来限制的话,可以先将链表遍历一遍,然后通过计数器来计算链表中的数据个数然后通过循环来找中间的结点,但是要求只能遍历一遍也就是说你在知道这个链表中有多少个数据的同时就要知道他的中间数据是哪一个。

 这样的话就不能通过刚刚所说的方法来实现,但是刚刚也提到了如果你在知道总共有多少个元素的同时知道他中间元素是哪一个就可以了,也就是说,结尾状态是一个指针指向了链表的结尾一个指针是指向了链表的中间,也就是说必须需要两个指针来完成。

  也就是我之前听过的快慢指针问题,一个指针走的快,一个指针走的慢,可以想一下,一个在结尾一个在中间是结束的条件,那也就是说快指针走的速度是慢指针的两倍,这样就很容易想到,快指针每次走两个慢指针每次走一个。当快指针走到结尾的时候,慢指针也就走了一半。

SListNode* SListFindMidNode(SListNode* list)

{

assert(list);

SListNode *fast=list;

SListNode *slow=list;

while (fast)

{

if (fast->_next != NULL)

{

 

fast = fast->_next->_next;

slow = slow->_next;

}

else

{

break;

}

 

}

return slow;

 

}

这是具体的代码实现,首先要判断传入的指针是不是空。之后创建两个指针一个快一个慢他们的初始值都是头指针,都从头开始走,如果快指针的next不为空那就是还没到结尾那就继续走,这时候快指针需要直接动两个,慢指针只动一个就可以了。如果为空也就是说现在fast已经走到最后一个了。这时候跳出循环,return返回当前慢指针指向的中间值即可。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值