标签:
“狸猫换太子”,不进行改动链表结构,只首尾交换len/2次。但是在本函数中用到了定位函数,定位函数实际上是遍历了一遍整个链表,所以综合效率很低,达到O(n^2).
//单链表反转(O(n^2))
void reverseList(Node* Head)
{
int count = numOfNodes(Head);
//首尾交换
for(int i=1; i<=count/2; i++)
{
Node* p1 = locateNodeI(Head, i);
Node* p2 = locateNodeI(Head, count+1-i);
swap(p1->value, p2->value);
}
}
就最一般的情况而言(没有之前写的辅助函数,即条件单纯为只有Head指向一个单链表)。可以实现O(n)效率。
做法是用三个相邻的指针进行遍历,在遍历的途中,更改指针方向。当然要注意链表数目分情况,和拆链的处理。
//单链表反转(O(n))
Node* reverseList2(Node* Head)
{
if(Head==NULL || Head->next==NULL) //空链和单节点
{
return Head;
}
Node* p1 = Head;
Node* p2 = Head->next;
Node* p3 = Head->next->next;
if(p3==NULL) //只有两个节点
{
p1->next = NULL;
p2->next = p1;
Head = p2;
return Head;
}
else //至少三个节点
{
p1->next = NULL;
while(p3!=NULL)
{
p2->next = p1;
//三个指针依次向后移一位
p1=p2;
p2=p3;
p3=p3->next;
}
p2->next = p1;
Head = p2;
return Head;
}
}
标签:
原文地址:http://www.cnblogs.com/claremore/p/4722654.html