只遍历链表一次求链表中间结点
2017-07-08 17:09
337 查看
ListNode* MidNode( ListNode* pHead ) { if ( NULL == pHead ) return NULL; else if ( NULL == pHead->m_pNext ) return pHead; else if ( NULL == pHead->m_pNext->m_pNext ) return pHead; ListNode* pFast = pHead; ListNode* pSlow = pHead; while ( NULL != pFast->m_pNext/*最后一个结点*/ ){ if ( NULL == pFast->m_pNext->m_pNext )//pFast->m_pNext不可能为NULL. 所以我们不必担心NULL->m_pNext情况发生 break; pFast = pFast->m_pNext->m_pNext; pSlow = pSlow->m_pNext; } return pSlow; }
测试代码:
//求链表的中间节点,链表中元素个数为奇数返回中间节点,偶数返回中间结点中任一个(这里返回第一个)
#include <iostream>
using namespace std;
struct ListNode{
int m_nKey;
ListNode* m_pNext;
ListNode( ListNode* pNext, int value )
: m_pNext( pNext )
, m_nKey( value )
{}
};
ListNode* MidNode( ListNode* pHead );
void push_back( ListNode** pHead, int value );
int main( )
{
ListNode* pHead = NULL;
//push_back( &pHead, 1 );
//push_back( &pHead, 2 );
//push_back( &pHead, 3 );
//push_back( &pHead, 1 );
//push_back( &pHead, 1 );
//push_back( &pHead, 2 );
push_back( &pHead, 1 );
push_back( &pHead, 2 );
push_back( &pHead, 3 );
push_back( &pHead, 4 );
cout << MidNode( pHead )->m_nKey << endl;
return 0;
}
void push_back( ListNode** pHead, int value )
{
if ( NULL == pHead )
return;
ListNode* pNewNode = new ListNode( NULL, value );
if ( NULL == *pHead ){
*pHead = pNewNode;
return;
}
ListNode* pNode = *pHead;
while ( NULL != pNode->m_pNext )
pNode = pNode->m_pNext;
pNode->m_pNext = pNewNode;
}
//我们不用那种 遍历一遍得出链表个数,再找中间结点的需要遍历链表两次的方法,我们用只遍历链表一次就得出中间结点方法
//我们利用两个指针,pFast和pSlow:快指针一次走两步,慢指针一次走一步。
//当快指针到达链表结尾或链表倒数第二个结点时(分别对应链表结点个数为奇数和偶数),慢指针到达链表最中间(奇数)或中间两个结点的前一个结点(偶数)
//我们把 链表为空, 链表只有一个结点,和链表有两个结点的情况单独拿出来处理.
ListNode* MidNode( ListNode* pHead ) { if ( NULL == pHead ) return NULL; else if ( NULL == pHead->m_pNext ) return pHead; else if ( NULL == pHead->m_pNext->m_pNext ) return pHead; ListNode* pFast = pHead; ListNode* pSlow = pHead; while ( NULL != pFast->m_pNext/*最后一个结点*/ ){ if ( NULL == pFast->m_pNext->m_pNext )//pFast->m_pNext不可能为NULL. 所以我们不必担心NULL->m_pNext情况发生 break; pFast = pFast->m_pNext->m_pNext; pSlow = pSlow->m_pNext; } return pSlow; }
相关文章推荐
- 单链表遍历一次求倒数第k个结点和中间结点
- 带头结点的单链表( 冒泡排序 一次遍历求中间结点的值) 链表 就地反转 倒数第k个结点
- 笔试面试,单链表相关(3)遍历一次找中间结点、倒数第K个结点
- 笔试面试,单链表相关(3)遍历一次找中间结点、倒数第K个结点
- 3.4 从无头链表中删除给定的结点 & 遍历一次逆转链表
- 遍历单链表一次,找出链表中间结点
- 给一个单链表,不知道结点N的值,怎样只遍历一次就可以求出中间结点,写出算法
- 程序员面试题精选(35):一次遍历链表求中间节点位置
- 第十三节 机试题之 遍历单链表一次,找出链表中间元素
- 删除单链表的头元素;单链表,只是遍历一次,求出中间节点
- 构造一个链表,经过一次循环找出中间的结点
- 链表3 ----- 一次遍历找到中间节点
- 链表的倒数第K个结点(一次遍历)
- 只遍历一次单链表,确定单链表中间节点的位置
- 查找单链表的中间节点,要求只能遍历一次链表
- 有关单链表的两个问题【遍历一次求中间节点,倒数第K个结点】
- 一次遍历单向链表找到中间节点
- C语言:【单链表】查找单链表的中间节点,要求只能遍历一次
- 【算法题】一次遍历单向链表找到中间节点
- 【链表】查找链表倒数第k个结点,要求只能遍历一次