编写一个将给定的线性单链表逆转的函数,只允许改变结点的指针值,不允许移动结点值 ,返回逆转后的链表的头指针 。
//结点结构
typedef struct node
{
int data; //存储数据
struct node* next; //指向下一个节点的指针
} NODE;
NODE * reverseLinkList (NODE * head)
{
//单向链表,请说明自己用的单向链表是否带表头结点必须考虑链表为空的情况
//请说明编程思路。 必要时请画图说明
//此单链表带表头结点
if(!head->next)return head;//判断链表为空的情况
else{
NODE* p=head->next;
NODE* pnext=p->next;
delete head;//删除原来的表头结点
p->next=NULL;//首元结点变为链表的最后一个结点,其next置为NULL
NODE* temp;
while(pnext){
temp=pnext->next;
pnext->next=p;
p=pnext;
pnext=temp;
}
pnext=new NODE;//设置表头结点
pnext->data=-1;//表头结点的数据域置为-1
pnext->next=p;
return pnext;
}
}
//完整代码 供测试使用
#include<bits/stdc++.h>
using namespace std;
//结点结构
typedef struct node
{
int data; //存储数据
struct node* next; //指向下一个节点的指针
} NODE;
NODE * reverseLinkList (NODE * head)
{
//单向链表,请说明自己用的单向链表是否带表头结点必须考虑链表为空的情况
//请说明编程思路。 必要时请画图说明
//此单链表带表头结点
if(!head->next)return head;//判断链表为空的情况
else{
NODE* p=head->next;
NODE* pnext=p->next;
delete head;//删除原来的表头结点
p->next=NULL;//首元结点变为链表的最后一个结点,其next置为NULL
NODE* temp;
while(pnext){
temp=pnext->next;
pnext->next=p;
p=pnext;
pnext=temp;
}
pnext=new NODE;//设置表头结点
pnext->data=-1;//表头结点的数据域置为-1
pnext->next=p;
return pnext;
}
}
NODE* create(int d[],int n){
NODE* head=new NODE;
head->data=-1;
NODE* p=head;
NODE* temp;
for(int i=0;i<n;i++){
temp=new NODE;
temp->data=d[i];
p->next=temp;
p=p->next;
}
p->next=NULL;
return head;
}
int main(){
int d[]={1,2,3,4,5,6,7,8,9,10};
NODE* head=create(d,10);
NODE*p=head->next;
while(p){
cout<<p->data<<endl;
p=p->next;
}
head=reverseLinkList(head);
p=head->next;
while(p){
cout<<p->data<<endl;
p=p->next;
}
}