链表部分翻转

时间:2019-02-17
本文章向大家介绍链表部分翻转,主要包括链表部分翻转使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目描述
【】给定一个链表,翻转该链表从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);

}