#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;
}
单链表的反转
最新推荐文章于 2019-12-12 23:12:57 发布