题目描述
【】给定一个链表,翻转该链表从m到n的位置。要求直接翻转而非申请新空间。
【如】:给定1—>2—>3—>4—>5,m–2,n–4,返回1—>4—>3—>2—>5。
【】假定给出的参数满足:1<=m<=n<=链表长度。
时间复杂度为o(n);
以下为代码
#include <stdio.h>
#include <stdlib.h>
typedef struct _SNode
{
int a;
struct _SNode *next;
}SNode;
SNode *createSNode(int lenth)//有头结点建立随机链表,形参p返回链表长度
{
SNode *head,*tail,*p=(SNode*)malloc(sizeof(SNode));
head=tail=p;
srand(time(0));
while(lenth--)
{
p=(SNode*)malloc(sizeof(SNode));
tail->next=p;
tail=p;
p->a=rand()%100;
}
tail->next=NULL;
return head;
}
void turnSNode(int begin,int end,SNode *head)//链表反转
{
SNode *p=head,*prev=NULL,*pprev=NULL,*temp_p=NULL;
int i=0;
if(end==begin)
exit (1);
while(p)
{
if(i+1==begin)
pprev=p;
if(i==begin)
temp_p=p;
if(i>begin&&i<=end)
{
prev=p;
p=p->next;
temp_p->next=p;//拆结点
prev->next=pprev->next;
pprev->next=prev;
}
else
p=p->next;
i++;
}
}
void print_SNode(SNode *head)
{
SNode *p=head->next;
while(p)
{
printf("%d\t",p->a);
p=p->next;
}
printf("\n");
}
int main(int argc,char*argv[])
{
int begin,end,lenth;
SNode *head;
scanf("%d%d%d",&begin,&end,&lenth);
head=createSNode(lenth);
print_SNode(head);
turnSNode(begin,end,head);
print_SNode(head);
}