C++链表倒序实现方法
本文通过一个实例展示了C++实现链表倒序的方法,对于C++数据结构的学习有很好的参考借鉴价值。具体方法如下:
首先,C++链表倒序的难点在于如何一个个地修改。虽然不是数组,但是大概思想是一样的,所以可以用一个for循序,一个游标对应for循环里面的i,只不过要记得前一个节点和后一个节点,尤其是后一个,因为修改之后就访问不到后面的,所以要记录。for每一个循环只改变所指向的那个节点的指针,这样既不会乱套了。
用一个for循环就非常好理解了,实例代码如下所示:
#include<iostream>
#include<cstdlib>
#include<ctime>
usingnamespacestd;
//链表节点类
classNode
{
private:
intm_data;
Node*m_next;
Node(Node&){}//copyconstructorisnotallowed
public:
explicitNode(intval=0):m_data(val),m_next(NULL){}
intgetData()const{returnm_data;}
voidsetData(intval){m_data=val;}
Node*getNext(void)const{returnm_next;}
voidsetNext(Node*p){m_next=p;}
};
//链表
classMyList
{
private:
Node*m_head;//piontertothefirstnodeofthelist
Node*m_tail;//poinoertothelastnodeofthelist
MyList(MyList&){}
public:
explicitMyList():m_head(NULL),m_tail(NULL){}
voidaddNode(Node*pNode);
voidshow(void)const;
voidreverse(void);
voidclean(void);
};
voidMyList::addNode(Node*pNode)
{
if(m_head)
{
m_tail->setNext(pNode);
m_tail=pNode;
}
else//blanklist
{
m_head=pNode;
m_tail=pNode;
}
}
voidMyList::show(void)const
{
Node*pNode=m_head;
while(pNode)
{
std::cout<<pNode->getData()<<"";
pNode=pNode->getNext();
}
}
voidMyList::reverse(void)
{
Node*preNode=NULL;//下面游标的前一个
Node*pNode;//指向每一个节点,相当于游标
Node*afterNode;//上面游标的上一个
for(pNode=m_head;pNode!=NULL;pNode=afterNode)//这里的每次循环对应一个节点,本质上和数组原理差不多
{
afterNode=pNode->getNext();
pNode->setNext(preNode);
preNode=pNode;
}
pNode=m_head;//交换头尾指针
m_head=m_tail;
m_tail=pNode;
}
voidMyList::clean(void)
{
if(m_head)
{
Node*pNode=m_head;
Node*pTemp;
while(pNode)
{
pTemp=pNode->getNext();
deletepNode;
pNode=pTemp;
}
m_head=m_tail=NULL;
}
}
intmain(void)
{
MyListlistHead;
srand((unsigned)time(NULL));
for(inti=0;i<9;i++)
{
inttemp=rand()%50;
Node*pNode=newNode(temp);
listHead.addNode(pNode);
}
listHead.show();
listHead.reverse();
cout<<endl;
listHead.show();
listHead.clean();
listHead.show();
system("pause");
}
相信本文实例对大家学习C++数据结构与算法能起到一定的参考借鉴作用。