单链表逆置原理:
头插法:
0(初始化)、q为每一步运算的主要节点位置,初始化为第一个;
1、r=q的后续,把q的后续记录下来;
2、q-》next=p,把q的后续指向p(也就是开始),换句话说,把q放在了最开始;
3、p=q,把新的开始设置为新插入的q(下一次循环时,他就是p了);
4、q=r,把下一步要进行运算的主要节点设置为r,也就是当前运算节点的下个节点。
相当于,一队小朋友双手搭着前一个人的肩。从第二个开始,把他挪到第一个人前面去,然后对下一个人做同样操作。
- // 单链表.cpp : 定义控制台应用程序的入口点。
- //单链表
- #include "stdafx.h"
- #include <iostream>
- #include <complex>
- using namespace std;
- typedef struct node {
- int data;//节点内容
- node *next;//下一个节点
- }node;
- //单链表的正向排序
- node *InsertSort(){
- node *head,*p,*q,*cur;
- int a=-1;
- head=new node;
- head->next=NULL;
- while (1)
- {
- cout<<"please input the data(-1,quit):";
- cin>>a;
- if (-1==a){ //输入-1结束
- break;
- }
- p=new node;
- p->data=a;
- p->next=NULL;
- q=head->next;
- if (q==NULL){//如果第一个节点为NULL,则对第一个节点赋值
- head->next=p;
- continue;
- }
- if (q->data>a){//如果插入值小于第一个节点,则插入到head之后
- p->next=head->next;
- head->next=p;
- }
- else{ //如果插入值大于等于第一个节点
- while (q->data<a){
- cur=q;
- q=q->next;
- if (q==NULL){ //如果到了末尾,则跳出循环
- break;
- }
- }
- if (q==NULL){ //如果到了末尾,直接插入到末节点后面
- cur->next=p;
- }
- p->next=q; //插入值插到q前面,cur后面
- cur->next=p;
- }
- }
- return head;
- }
- //打印单链表
- void print(node *head){
- node *p=head->next;
- int index=0;
- if (p==NULL)//链表为NULL
- {
- cout<<"Link is empty!"<<endl;
- getchar();
- return;
- }
- while (p!=NULL)//遍历链表
- {
- cout<<"The "<<++index<<"th node is :"<<p->data<<endl;//打印元素
- p=p->next;
- }
- }
- //单链表逆置
- node *reverse(node *head){
- node *p,*q,*r;
- if (head->next==NULL)//链表为空
- {
- return head;
- }
- p=head->next;
- q=p->next;//保存原第2个节点
- p->next=NULL;//原第1个节点为末节点
- while (q!=NULL)//遍历,各个节点的next指针反转
- {
- r=q->next;
- q->next=p;
- p=q;
- q=r;
- }
- head->next=p;//新的第一个节点为原末节点
- return head;
- }
- //寻找单链表的中间元素
- node *search_mid(node *head){
- node *current=NULL; //current指向当前已扫描链表的尾节点
- node *mid=NULL; //mid指向当前已经扫描的子链表的中间元素
- int i=0,j=0;
- current=mid=head->next;//都指向第一个节点
- while (current!=NULL){
- if (i/2>j)
- {
- j++;
- mid=mid->next;
- }
- i++;
- current=current->next;
- }
- return mid;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- node *head=InsertSort();//创建单链表
- cout<<"--------after insertSort()------------"<<endl;
- print(head);
- node *preverse=reverse(head);
- cout<<"--------after reverse()------------"<<endl;
- print(preverse);
- node *p=search_mid(head);
- cout<<"--------after search_mid()------------"<<endl;
- cout<<"search_mid():"<<p->data<<endl;
- system("pause");
- delete [] head;
- return 0;
- }
// 单链表.cpp : 定义控制台应用程序的入口点。
//单链表
#include "stdafx.h"
#include <iostream>
#include <complex>
using namespace std;
typedef struct node {
int data;//节点内容
node *next;//下一个节点
}node;
//单链表的正向排序
node *InsertSort(){
node *head,*p,*q,*cur;
int a=-1;
head=new node;
head->next=NULL;
while (1)
{
cout<<"please input the data(-1,quit):";
cin>>a;
if (-1==a){ //输入-1结束
break;
}
p=new node;
p->data=a;
p->next=NULL;
q=head->next;
if (q==NULL){//如果第一个节点为NULL,则对第一个节点赋值
head->next=p;
continue;
}
if (q->data>a){//如果插入值小于第一个节点,则插入到head之后
p->next=head->next;
head->next=p;
}
else{ //如果插入值大于等于第一个节点
while (q->data<a){
cur=q;
q=q->next;
if (q==NULL){ //如果到了末尾,则跳出循环
break;
}
}
if (q==NULL){ //如果到了末尾,直接插入到末节点后面
cur->next=p;
}
p->next=q; //插入值插到q前面,cur后面
cur->next=p;
}
}
return head;
}
//打印单链表
void print(node *head){
node *p=head->next;
int index=0;
if (p==NULL)//链表为NULL
{
cout<<"Link is empty!"<<endl;
getchar();
return;
}
while (p!=NULL)//遍历链表
{
cout<<"The "<<++index<<"th node is :"<<p->data<<endl;//打印元素
p=p->next;
}
}
//单链表逆置
node *reverse(node *head){
node *p,*q,*r;
if (head->next==NULL)//链表为空
{
return head;
}
p=head->next;
q=p->next;//保存原第2个节点
p->next=NULL;//原第1个节点为末节点
while (q!=NULL)//遍历,各个节点的next指针反转
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=p;//新的第一个节点为原末节点
return head;
}
//寻找单链表的中间元素
node *search_mid(node *head){
node *current=NULL; //current指向当前已扫描链表的尾节点
node *mid=NULL; //mid指向当前已经扫描的子链表的中间元素
int i=0,j=0;
current=mid=head->next;//都指向第一个节点
while (current!=NULL){
if (i/2>j)
{
j++;
mid=mid->next;
}
i++;
current=current->next;
}
return mid;
}
int _tmain(int argc, _TCHAR* argv[])
{
node *head=InsertSort();//创建单链表
cout<<"--------after insertSort()------------"<<endl;
print(head);
node *preverse=reverse(head);
cout<<"--------after reverse()------------"<<endl;
print(preverse);
node *p=search_mid(head);
cout<<"--------after search_mid()------------"<<endl;
cout<<"search_mid():"<<p->data<<endl;
system("pause");
delete [] head;
return 0;
}