美团网2014校招:链表翻转

思想:N:表示要翻转的个数,当N=1表示翻转一个,N=2,表示翻转2个。。。那么,我们一个一个翻转,从开头第二个开始,比如:N=3时

步骤:

1、 1-> 2 ->3->4->5    i=1

2 、    2->1->3->4->5      i=2

3、    3->2->1->4->5       i=3

/*
	author:wxg
	function:reverse the LinkeList with specified number n;
*/

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
struct Lnode{
	int data;
	Lnode *next;
};

void initLink(Lnode *&L,int a[]){
	Lnode *p;
		
	for(int i=0;i<5;i++){
		Lnode *tmp = (Lnode *)malloc(sizeof(Lnode));
		tmp->data = a[i];
		if(i==0) L=p=tmp;
		else{
			p->next = tmp;
			p=p->next;
		} 
		
	}
	p->next = NULL;
}
void printLink(Lnode *L){
	while(L){
		printf("%d  ",L->data);
		L = L->next;
	}
	printf("\n");
}

/*
	翻转单个节点:将第N个节点翻转到第一个 
*/
void reverseSingle(Lnode *&L,int n){  //千万记住,如果要修改参数的内容,一定要使用 &  !!  void reverseSingle(Lnode *L,int n)这样是不对的! 
	assert((L!=NULL)&&(n>0));
	Lnode *tmp,*p=L;
	for(int i=0;i<n;i++){
		tmp=p;
		p=p->next;
		if(p==NULL) return ;
	}
	tmp->next=p->next;
	p->next=L;
	L=p;
}

/*
	翻转指定的前 N 个节点 
*/ 
void reverse(Lnode *&L,int n){
	
	for(int i=1;i<n;i++){
		reverseSingle(L,i);
	}
}


void reverseLinklist(Lnode *&pList){
	Lnode *pNext=NULL;
	Lnode *pCur = pList->next;
	pList->next = NULL;
	while(pCur!=NULL){
		pNext=pCur->next;
		pCur->next=pList;
		pList=pCur;
		pCur=pNext;
	}
}

int main(){
	int a[]={2,4,56,7,9};
	Lnode *LA=NULL; 
	initLink(LA,a);
//	reverse(LA,5);
	reverseLinklist(LA);
	printLink(LA);
	return 0;
}

复杂度:O(n)

请大家批评指正!

你可能感兴趣的:(美团网2014校招:链表翻转)