逆转单链表

    技术2025-04-29  25

    //逆转单链表 struct node *reverse_LList(node *head) { //以p作为当前结点处理,头结点为逆转前的头结点             struct node *p,*q,*temp;      if(head == NULL) cout << "空表" << endl;//头结点为0,空表       q = head;            //q指向头结点       p = head->next;      //p指向头结点后一个结点       head = p;            //头结点进一位       temp = p->next;      //保存当前结点指针域       q->next = NULL;      //逆转头结点为尾结点的情况,头指针为空       p->next = q;         //后一个结点指向头结点                 while(temp->next != NULL) //判断当前结点的后一结点指针域是否为空,即判断是否为尾结点       {           q = head;       //q指向头结点              p = temp;       //p指向头结点后一个结点            temp = p->next; //保存当前结点指针域           head = p;       //头结点进一位              p->next = q;    //后一个结点指向头结点                                              }      //此时temp表示以前的尾结点,p表示temp结点的前一结点       head = temp;    //逆转尾结点为头结点       head->next = p; //头结点指针域指向p       return head;                       } //逆转循环链表 struct node *reverse_LList(node *head) { //以p作为当前结点处理,             struct node *p,*q,*temp,*s;      int count = 0;       if(head == NULL) cout << "空表" << endl;//头结点为0,空表                                                  do      {           q = head;       //q指向头结点                     temp = p->next; //保存当前结点指针域              p = temp;       //p指向头结点后一个结点                      head = p;       //头结点进一位              p->next = q;    //后一个结点指向前一结点           if(count == 0)  {q->next = s} //记录下第一个结点            count++;                                              }while(temp->next != head); //判断当前结点的后一结点指针域是否为逆转前的头结点,即判断是否为尾结点       //循环完之后,此时temp表示以前的尾结点,p表示temp结点的前一结点       head = temp;    //逆转尾结点为头结点       head->next = p; //头结点指针域指向p      s = head;       //s指向头结点       return head;                      } //逆转双向链表 struct node *reverse_bilateral_LList(node *head) {      struct node *p,*q,*tp,*tq; //处理尾结点的情况, 即将head结点逆转为尾结点.       q = head;              //q指向头结点      p = head->next;        //p指向头结点后一结点      tp = p->next;          //tp存储p的右指针域 //先处理p结点       p->next = q;           //p的右指针指向q      p->prior = tp;         //p的左指针指向它的下一个元素 //再处理q结点       q->prior = p;          //q结点左指针指向p      q->next = NULL;        //q结点右指针为空,表示逆转后尾结点next为空      while(tp->next != NULL)      {                     tp = p->next;     //tp存储p的右指针域           p = tp;           //p结点进一位           tq = q->next;     //tq存储q的右指针域           q = tq;           //q结点进一位 //先处理p结点           p->next = q;                 p->prior = tp; //再处理q结点           q->prior = p;           q->next = head;  //q结点右指针区域指向该结点的前一个元素,即head结点.           head = q;        //head结点进一位        } //最后再处理头结点情况,即将尾结点逆转为头结点.      head = tp;      head->next = p;      head->prior = NULL;       return head;                     } 深受liupengty前辈教诲,不敢不举一反三,以谢厚望,如有错误还请前辈指教

    最新回复(0)