一道面试题:将单向链表按如下规则逆序:
5->4->3->2->1: pHead->5;pStart->3;
逆序结果:3->4->5->1->2 ;
5->4->3->2->1; pHead->5,pStart->1;
逆序结果:1->2->3->4->5;
5->4->3->2->1; pHead->5;pStart->5;
逆序结果:5->1->2->3->4;
要求不能分配新的链表节点,只能使用临时指针变量,将链表按上述规则逆序.
思路:
将pStart后的链表逆序,再将pStart前的链表逆序,然后将pStart后的链表直接接在后面即可;
测试代码如下:
SinglyLinkNode *ReverseNode(SinglyLinkNode *pHead,SinglyLinkNode *pStart) { SinglyLinkNode *pTmp=pStart ; SinglyLinkNode *pTmp1=NULL ; SinglyLinkNode *pTmp2=NULL ; if(pTmp->next!=NULL&&pTmp->next->next!=NULL) {//reverse the latter part pTmp1=pTmp->next->next->next ; pTmp2=pTmp->next ; pTmp->next=pTmp->next->next ; pTmp->next->next=pTmp2 ; pTmp2->next=NULL ; while(pTmp1!=NULL) { pTmp2=pTmp1->next ; pTmp1->next=pTmp->next ; pTmp->next=pTmp1 ; pTmp1=pTmp2 ; } } pTmp=pTmp->next ; if(pHead!=pStart&&pHead!=NULL&&pHead->next!=NULL) {//reverse forebody pTmp1=pHead->next ; pTmp2=pHead->next->next ; pHead->next=NULL ; pTmp1->next=pHead ; pStart->next=pTmp1 ; while(pTmp2!=pStart) { pTmp1=pTmp2 ; pTmp2=pTmp2->next ; pTmp1->next=pStart->next ; pStart->next=pTmp1 ; } } pHead->next=pTmp ; return pStart ; } int main() { int a[]={5,4,3,2,1} ; SinglyLinkNode *pHead=CreateLinkList(a,sizeof(a)/sizeof(a[0])) ; printf("Origin Order:\n") ; PrintLinkNode(pHead) ; SinglyLinkNode *pTmp=GetNode(pHead,0) ; printf("Node:%d",pTmp->value) ; pHead=ReverseNode(pHead,pTmp) ; printf("Reverse Order:\n") ; PrintLinkNode(pHead) ; }