zoukankan      html  css  js  c++  java
  • 只遍历一次单链表,确定单链表中间节点的位置

    问题:给定一个单链表,不知道节点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就是中间节点了。


  • 相关阅读:
    IIS 下配置无后缀的URL ReWrite
    获得代理IP或客户端Ip
    asp.net发送邮箱
    URLRewrite伪静态与AspNetPager分页控件的结合
    邮箱大全
    注册表单验证正则表达式
    aspx中伪静态的实现
    JMail发送邮件
    IE 6中负的margin值导致出界部分不显示问题的解决
    Culminis为每个用户组提供的免费TechNet Plus Direct订阅
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3347918.html
Copyright © 2011-2022 走看看