当前位置:编程学习 > 网站相关 >>

只遍历一次单链表,确定单链表中间节点的位置

问题:给定一个单链表,不知道节点N的值,怎样只变量一次就知道中间节点?
 
 
 
#include "stdafx.h"
 
#include <iostream>
 
using namespace std;
 
 
 
structTNode
 
{
 
    int nValue;
 
    TNode*pNext;
 
    TNode()
 
    {
 
       nValue= 0;
 
       pNext= NULL;
 
    }
 
};
 
 
 
TNode* CreateList(int* nArray, intnLen)
 
{
 
    TNode*pHead = new TNode();
 
    TNode*pCur = NULL;
 
    TNode*pPre = pHead;
 
    for(int i=0;i<nLen; ++i)
 
    {
 
       pCur= new TNode();
 
       pCur->nValue= nArray[i];
 
       pPre->pNext= pCur;
 
       pPre= pCur;
 
    }
 
 
 
    return pHead;
 
}
 
voidPrintList(TNode*& pHead)
 
{
 
    if(NULL == pHead || NULL == pHead->pNext)
 
    {
 
       cout<<"列表为空"<<endl;
 
       return;
 
    }
 
    TNode*p = pHead->pNext;
 
    while(NULL != p)
 
    {
 
       cout<<p->nValue<<endl;
 
       p= p->pNext;
 
    }
 
 
 
}
 
 
 
 
 
boolFindMiddleValue(TNode* pHead,int& nValue)
 
{
 
    if(NULL == pHead || NULL == pHead->pNext)
 
    {
 
       return false;
 
    }
 
    TNode*p = NULL;
 
    TNode*q = NULL;
 
    p= pHead->pNext;
 
    q= pHead->pNext;
 
    while(NULL != q)
 
    {
 
       q= q->pNext;
 
       if(NULL == q)
 
       {
 
           break;
 
       }
 
       q= q->pNext;
 
       if(NULL == q)
 
       {
 
           break;
 
       }
 
       p= p->pNext;
 
    }
 
   
 
    nValue= p->nValue;
 
 
 
    return true;
 
}
 
 
 
int_tmain(int argc, _TCHAR* argv[])
 
{
 
    int nLen = 7;
 
    int nArray[] = {5,14,3,12,1,8,10}; //{3,5,1};//
 
    TNode*pHead = CreateList(nArray,nLen);
 
    cout<<"原始链表中的内容:"<<endl;
 
    PrintList(pHead);
 
    int nValue;
 
    if(!FindMiddleValue(pHead,nValue))
 
    {
 
       cout<<"没有找到"<<endl;
 
    }
 
    cout<<"找到的中间节点为:"<<nValue<<endl;
 
   
 
    return 0;
 
}
 
执行结果:
 
 
 
基本思想:设立两个指针,比如*p和*q。p每次移动两个位置,而q每次移动一个位置,当p到达最后一个节点时,q就是中间节点了。
 
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,