将单链表就地逆置,要求不创建新的结点
输入要求
先输入一个n,表示接下来要输入n个数
接下来一排输入n个数,构造链表。
详见样例输入。
输出要求
见样例输出
测试数据
输入示例
5
1 2 3 4 5
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType; // 元素数据类型
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
void createLList(LinkList &L, int n); // 采用尾插法创建链表
void inverseLList(LinkList &L); // 链表就地逆置,不创建任何结点
void printLList(LinkList L); // 打印链表,每个数字后有一空格
int main(){
int n;
LinkList list;
scanf("%d",&n);
createLList(list, n);
printLList(list);
inverseLList(list);
printLList(list);
}
*************************************************************************************************************
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType; // 元素数据类型
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
void createLList(LinkList &L, int n); // 采用尾插法创建链表
void inverseLList(LinkList &L); // 链表就地逆置,不创建任何结点
void printLList(LinkList L); // 打印链表,每个数字后有一空格
int main(){
int n;
LinkList list;
scanf("%d",&n);
createLList(list, n);
printLList(list);
inverseLList(list);
printLList(list);
}
void createLList(LinkList &L, int n){
L = new LNode;
L->next = NULL;
LNode *r = L;
for(int i=0;i<n;i++){
LNode *p= new LNode;
scanf("%d",&p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
void inverseLList(LinkList &L){
LNode *PL1=L->next;
LNode *PLn=PL1->next;//Ïȱ£´æÍ·½áµãºóÃæÒ»¸ö½áµãµÄÖ¸Õ룬²»È»Í·½áµã¿³¶Ïºó½«¶ªÊ§ºóÃæµÄ½áµã
PL1->next=NULL;//¿³¶ÏµÚÒ»¸ö½áµã£¬Ò²¾ÍÊÇÍ·½áµã
while(PLn)
{
LNode *Tmp=PLn->next;//ÓÃTmp±£´æµ±Ç°½áµãµÄnext½áµãµÄÖ¸Õ룬ȷ±£¿³¶Ïµ±Ç°½áµãºó¶ªÊ§ºóÃæµÄ½áµã¡£
PLn->next=PL1;
L->next=PLn;
PL1=PLn;//PLn³ÉΪÏÂÒ»¸ö½áµãµÄnextÖ¸ÕëµÄÖ¸ÏòÄ¿±ê
PLn=Tmp;//PLn±ä³ÉÐèÒª²åÈëµÄ½áµãµÄÖ¸ÕëÁË
}
}
void printLList(LinkList L){
LNode *p = L->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}