【let code】876.链表的中间节点(链表遍历中的奇技淫巧)

题目表述:

在这里插入图片描述
问题分析:

  1. 暴力
    首先计算链表的长度,然后计算中间位置的下标,再重新开始遍历链表到指定下标返回。
  2. 借助容器
    借助容器可按下标返回的特点,将链表用容器存储,后直接按下标访问。
  3. 快慢指针
    设置快,慢两个指针,快指针每次步长为两个结点,慢指针每次一个结点,当快指针到最后一个结点时慢指针刚好到链表中间。
    完整代码:
//暴力解法
 ListNode* middleNode(ListNode* head)
 {       
  	 ListNode* t1 = head;       
  	  int index = 0;
       	 // count length        
       	 while (t1)       
       	 {           
       	 	 t1 = t1->next;           
       	 	 index++;        
       	 }
       	 //find node       
       	  index /= 2;       
       	 while (index--)            
       	 	head = head->next;
        	return head;    
 }
 //借助容器
  ListNode* middleNode(ListNode* head)
  {    
        vector<ListNode*> A = {head};        
        while (A.back()->next != NULL)            
        	A.push_back(A.back()->next);        
        return A[A.size() / 2];
   }
 //快慢指针
  ListNode* middleNode(ListNode* head)
  {       
  	ListNode* slow = head;        
  	ListNode* fast = head;        
  	while (fast != NULL && fast->next != NULL) 
  	{            
  		slow = slow->next;            
  		fast = fast->next->next;       
  	}        
  	return slow;    
 }

结果展示:(分别对应三个不同的算法)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值