单链表的反转

#include <iostream>
#include <string>

using namespace std;     //使用命名空间 

struct node            //定义一个结构体 
{
	char val;          //定义一个字符型变量 
	struct node * next; //定义一个结构体指针 
};

typedef struct node NODE;   //为结构体类型重新创建一个名称 
typedef NODE * Link;        //为结构体指针重新创建一个名称 

/*遍历整个链表*/
void out_link(Link pHead)
{
	Link temp = pHead->next;     //定义一个临时指针,指向头指针下一个,方便下一次遍历 
	while(temp)                 //如果temp指针到最后指向NULL后,即跳出循环 
	{
		cout<<temp->val;         //输出该指针指向的节点的数值 
		temp = temp->next;        //指针指向下一个 
	}	
}

/*翻转整个链表*/
void reverse_link(Link pHead) 
{
	if(pHead==NULL || pHead->next==NULL || pHead->next->next == NULL)
	//if(!pHead || !pHead->next || !pHead->next->next)
		return ;//在这里直接返回函数调用处,下面的语句就不执行了,中断当前函数的执行,把程序控制权交给函数调用者
	Link p1 = pHead;       //定义三个指针,依次指向头节点,头节点下一个,头节点的下一个下一个 
	Link p2 = p1->next;     
	Link p3 = p2->next;
	while(p3)       //当第三个指针不指向空时,继续执行while里面的语句 
	{
		p2->next = p1;       //将p2节点里面的指针由原来指向p3,现在指向p1;   
		p1 = p2;             //定义的三个指针全部往右移一个节点 
		p2 = p3;             //注意:上次把这一行与上一行对调了后出现,翻转后只输出原来的最后一个节点的数,并且死循环 
		p3 = p3->next; 
	} 
	p2->next = p1;    //最后一个节点的指针指向前一个 
 	pHead->next->next = NULL;
	pHead->next = p2; 
}

 
/*创建一个链表,传入一个字符串*/ 
Link create(string & str_link)   
{
	int len = str_link.length();   //计算出这个字符串的长度 
	Link pHead = new node();       //用new运算符在堆上分配一个结构体的大小的节点 
	pHead->next = NULL;            //头节点里面的结构体指针指向NULL 
	Link preNode = pHead;          //定义一个结构体指针指向要插入节点的前一个 
	for(int i=0;i<len;i++)         //实现字符串中的字符循环插入 
	{
		Link pNode = new node();  //在堆上分配一个新的节点  
		pNode->val = str_link[i]; //插入字符 
		pNode->next = NULL;        //将新分配的节点中的结构体指针指向NULL 
		preNode->next = pNode;    //实现新的节点实现尾插
		preNode = pNode;          //将preNode指针指向该链表的最后一个 
	}
	return pHead;                 //返回链表头指针指向的位置 
}
void reverse_test()
{
	string str;
	cout<<"输入一个字符串:\n";
	cin>>str;
	Link pHead = create(str);     //创建一个链表,将字符串中的每个字符分配到每个节点,返回头指针的位置	
	out_link(pHead);      		  //遍历整个链表 
	reverse_link(pHead) ;  		  //翻转整个链表 
	cout<<endl;
	out_link(pHead);      		  //遍历整个链表 
} 

int main(int argc,char **argv)
{
	reverse_test();     //测试输出一个逆序的字符串 
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值