标签:
“狸猫换太子”,不进行改动链表结构,只首尾交换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