c++ 链表长度_数据结构(4)-链表-Part2

3b2030083f9962ac60fc2432e49f03b2.png

输出链表中间的元素

  • 方法1(遍历链表两次)
  1. 遍历链表一次,得到链表的长度n。
  2. 再次遍历链表,输出n/2位置的元素。
  • 方法2(遍历链表一次)
  1. 创建两个节点slow和fast。
  2. 每次移动fast指针遍历两个节点;每次移动slow指针变量一个节点。
  3. 当fast指针指向NULL(链表有偶数个节点),或者fast为NULL(链表有奇数个节点)时,slow节点就是链表的中间节点。

C++程序实现(方法2),时间复杂度为

#include 

翻转链表

36a104cb657ba05320279d959476271b.png
  • 算法中需要使用三个指针变量:
  1. p - 用于保存前向节点。
  2. c - 用于保存当前节点。
  3. n - 用于保存下一个节点。
初始化 p 为NULL,c等于head节点,n等于c指向的节点。删除n与c之间的连接。建立一个c指向p的连接。

c410f528ba6995f9b5bcd2b3e1aed118.png
  • p=c, c=n
  • 对每个节点重复上述步骤
  • head=p

C++程序源码如下,时间复杂度为

:
#include 

判断链表中是否有环

e99b601ddd0ebe76ea0123c8c33693f4.png
  • 设置两个指针变量slow和fast,起初他们都是指向head节点。
  • 在遍历链表时,slow每次遍历两个节点,fast每次遍历一个节点。
  • 如果fast或者fast指向的地址为NULL,就表明已经遍历到链表的末尾,且链表没有环。
  • 如果slow和fast节点最终相遇了,则表明链表中存在环。
int 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值