链表的正序生成、插入和倒置

前端之家收集整理的这篇文章主要介绍了链表的正序生成、插入和倒置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

以前写的都是生成的都是逆序的,所以不需要头结点。如果生成正序链表则需要头结点来完成。@H_404_1@

#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;
}

猜你在找的设计模式相关文章