【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;    
 }

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页