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++数据结构与算法能起到一定的参考借鉴作用。