码迷,mamicode.com
首页 > 其他好文 > 详细

链表 单链表反转

时间:2015-08-12 01:08:40      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

思路1:O(n^2).

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

思路2:O(n).

就最一般的情况而言(没有之前写的辅助函数,即条件单纯为只有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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!