1:以前写的都是带有头节点的链表的逆制,其思想是:把头节点后的后一个节点摘下来进行头插就可以了,实现的方法也不难,只需要两个指针就可以实现,而我这主要实现的是不带头节点的链表,而且时间复杂度位O(n),也是需要两个指针来实现,具体看代码:
2:sort.h-->头文件
#include<iostream>
using namespace std;
///链表
typedef struct Node
{
int data;
struct Node *next;
}Node;
void CreatNode(Node *&head,int x)//创建函数,创建一个不带头节点的链表
{
Node *s=new Node;
s->data=x;
s->next=NULL;
if(head==NULL)
head=s;
else
{
Node *p=head;
while(p->next !=NULL)
p=p->next;
p->next=s;
}
}
void reserve(Node *&head)//逆制函数
{
Node *first=head;
head=NULL;//这一步很重要,首先把head(即头节点质位NULL)
while(first !=NULL)
{
Node *s=first;//让s也指向first节点
first=first->next;//接下来再让first指向它的下一个节点
s->next=head; //把head(即之前的那个头节点)
head=s; //再让head指向下一个头节点
}
}
void show( Node *head)
{
Node *p=head;
while(p !=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
2:main.cpp //主函数
#include"sort.h"
void main()
{
Node *head=NULL;
int x;
cout<<"输入数据:";
while(cin>>x,x!=-1)
{
CreatNode(head,x);
}
cout<<"逆制前:"<<endl;
show(head);
reserve(head);
cout<<"逆制后:"<<endl;
show(head);
}