算法思路:先将链表后半部分逆序,然后用两对指针分别操作节点的指向。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int num;
struct Node* next;
};
void BuildLink(Node*& head, int num)
{
Node* ptrCurrent=NULL;
for(int i=0; i<num; i++)
{
Node* aNode=(Node*)malloc(sizeof(Node));
aNode->num=i+1;
aNode->next=NULL;
if(i==0)
{
head=ptrCurrent=aNode;
}
else
{
ptrCurrent->next=aNode;
ptrCurrent=aNode;
}
}
}
void ReleaseLink(Node*& head)
{
Node* ptr=NULL;
while(head!=NULL)
{
ptr=head;
head=head->next;
free(ptr);
}
}
int CalLinkLength(Node* head)
{
Node* ptr=head;
int len=0;
while(ptr!=NULL)
{
ptr=ptr->next;
len++;
}
return len;
}
Node* ReverseLink(Node* head)
{
Node* pPrev=NULL;;
Node* pCurrent=head;
Node* pNext=NULL;
while (pCurrent!=NULL)
{
pNext=pCurrent->next;
pCurrent->next=pPrev;
pPrev=pCurrent;
pCurrent=pNext;
}
return pPrev;
}
void ReverseRightHalf(Node*& head, int len)
{
int step=len/2;
Node* ptr=head;
for(int i=0; i<step; i++)
ptr=ptr->next;
Node* p=ptr;
p->next=ReverseLink(p->next);
Node* ptr2=p->next;
p->next=NULL;
Node* ptr1=head;
Node* next1=NULL, *next2=NULL;
while(ptr1!=NULL && ptr2!=NULL)
{
next1=ptr1->next;
next2=ptr2->next;
ptr1->next=ptr2;
ptr2->next=next1;
ptr1=next1;
ptr2=next2;
}
}
int main(int argc, char** argv)
{
Node* head=NULL;
BuildLink(head, 10);
int len=CalLinkLength(head);
ReverseRightHalf(head, len);
ReleaseLink(head);
return 0;
}