[转]有(无)头结点的单向链表的反转(只需要三个指针)

/*定义数据结构类型,单向链表结构体包括数据部分和指针部分*/
struct node 
{
        unsigned int item;
        struct node * next;
};
/*不带头结点的反转函数,该函数采用三个结构体指针分别保存 前一节点 当前节点 后一节点 的值,将当前节点的指针域值直接指向前一节点,后一节点作为链表后面的引线,再将这三个指针往后移一位,递归进行前面的动作*/
struct node * reverse(struct node *head)
{
     if((head == NULL) || (head->next==NULL))  //链表为空,或只有一个结点(无需反转),直接返回
          return head;
     struct node *pre, *cur, *ne;
     pre = head;         //将前面几个节点的地址依次保存在新定义的结构体指针
     cur = head ->next;
     while(cur)
     {
          ne = cur->next;  //如果当前节点不为空,则将其指针域赋给ne指针
          cur->next = pre; //直接将两个指针的指向反转
          pre = cur;           //将当前节点赋给pre,将三个指针在链表中的位子都往后移一位
          cur = ne;     
      }
     head->next = NULL;//将原来的第一个节点的指针域赋为空,作为尾节点
     head = pre;            //将原来的尾节点变成新链表的第一个节点
     return head;
}
******************************************************************
/*带头结点的反转函数,该函数采用三个结构体指针分别保存 前一节点 当前节点 后一节点 的值,将当前节点的指针域值直接指向前一节点,后一节点作为链表后面的引线,再将这三个指针往后移一位,递归进行前面的动作;因为此链表为带头结点的链表,头结点的数据域并没有存放有效的数据,此函数与上一函数的区别是,需要保持头结点不动,只需要反转后面存有效数据的结点部分*/
struct node * reverse(struct node *head)
{
     if(!head || !head->next )  //判断链表是否为空或是否只有一个头节点
          return head;
     struct node *pre, *cur, *ne;
     pre = head->next;         //将前面几个节点的地址依次保存在新定义的结构体指针
     cur = pre ->next;
     while(cur)
     {
          ne = cur->next;  //如果当前节点不为空,则将其指针域赋给ne指针
          cur->next = pre; //直接将两个指针的指向反转
          pre = cur;           //将当前节点赋给pre,将三个指针在链表中的位子都往后移一位
          cur = ne;     
      }
     head->next ->next= NULL;//将原来的第一个节点的指针域赋为空,作为尾节点
     head->next = pre;            //将原来的尾节点变成新链表的第一个节点(头结点所指向的节点
     return head;
}
posted @ 2013-09-29 17:52  威少  阅读(674)  评论(0编辑  收藏  举报