单链表的倒置
代码:
#include <iostream>
using namespace std;
enum Error { underflow,overflow,success };
template <class Node_entry >
struct Node {
Node_entry entry;
Node<Node_entry> * next;
Node();
Node ( Node_entry item,Node<Node_entry> * add_on=0 );
};
template< class Node_entry>
Node< Node_entry >::Node() {
next = NULL;
}
template< class Node_entry>
Node<Node_entry>::Node(Node_entry item,Node<Node_entry> *add_on) {
entry = item;
next = add_on;
}
// 以上是建立了一个模板的节点类型
template<class Node_entry>
Node<Node_entry> * Inverse (Node<Node_entry> * &first ) { // first 是传入链表的头指针
Node<Node_entry> * p = first,* q;
if( first == NULL ) return first;
else { p = p->next; first->next = NULL; // 把原来的头结点的next赋值为NULL }
while( p ) { //通过循环向头指针后插入结点 。
q = p->next;
p->next = first;
first = p;
p = q; }
return first;}
void main() {
Node<int> * head = new Node<int> (1,NULL);
Node<int> * p1 = new Node<int> (2,head);
Node<int> * p2 = new Node<int> (3,p1);
Node<int> * p3 = new Node<int> (4,p2);
cout<<p3->entry<<endl; // 结果为 4, 这里 p3 为头指针
Node<int> * temp = Inverse( p3 );
cout<<p3->entry<<endl; // p3 现在也是头指针,不过由于已经倒置,所以 输出为 1
}
小经验:p->next 在左值位置 := 把一个节点链接到另一个节点尾;p->next 在右值 := 把p下一个节点的指针赋值给另一个指针