以前写的都是生成的都是逆序的,所以不需要头结点。如果生成正序链表则需要头结点来完成。
#include <iostream> #include <string> using namespace std; class MList{ struct LNode{ int elem; LNode *next; }; //利用一个头结点,一个头指针和一个尾指针实现正序插入的链表 //head值初始化一次即可(因为总指向头所以不能变化,需要一个头结点 //达到这个效果)。tail在每次插入时候调整。 //也可以使用if……else结构来处理 LNode header; LNode *head; LNode *tail; public: MList(){ head=&header; tail=&header; } void add(int value); void reve(); void display(); }; void MList::add(int value){ LNode *p=new LNode(); p->elem=value; p->next=NULL; tail->next=p; tail=p; } void MList::display(){ LNode *p=head->next; while (p != NULL) { cout << p->elem << endl; p=p->next; } } void MList::reve(){ //这里的调整技巧 LNode *h = head->next; LNode *tmp1 = head->next; LNode *tmp2 = tmp1->next; while (tmp2 != NULL) { head->next=tmp2; tmp2=tmp2->next; head->next->next=tmp1; tmp1=head->next; } tail=h; tail->next=NULL; } int main(){ MList mylist; mylist.add(1); mylist.add(2); mylist.add(3); mylist.display();//1 2 3 mylist.reve(); mylist.add(4); mylist.reve(); mylist.display();//4 1 2 3 return 0; }