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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值