您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        C/C++ 双链表之逆序的实例详解
一、结点结构
双向链表的数据结构定义如下:
 typedef struct node
    {
      ElemType data;
      struct node *prior
      struct node *next;
    }list;
其中,ElemType可以是任意数据类型如int、float或者char等,在算法中,规定其默认为int类型。
二、带头结点
        本文描述的是双向链表逆序,链表逆序需要维护3个指针,分别指向前一个节点、当前节点和下一个节点,具体代码如下:
 list *reverselist(list *head)
    {
      if ((NULL == head) || (NULL == head->next))
      {
        return head;
      }
      list *p1=head->next, *p2=p1->next, *p3=NULL;
      p1->next = NULL;
      while (p2)
      {
        p3 = p2->next;      // 保存当前结点的下一结点
        p2->next = p1;      // 改变当前结点的next域,指向它的前一个结点
        p1->prior = p2;     // 改变前一个结点的prior域,指向它的后一个结点
        p1 = p2;         // 指针移到下一个结点
        p2 = p3;
      }
      head->next = p1;       // 恢复头结点
      p1->prior = head;
      return head;
    }
在链表逆序过程中,非常重要的一点是要防止断链问题,因此,在移动指针逆序某个结点时,需要用一个指针指向该结点的下一结点,防止下一结点丢失。
三、不带头结点
 list *reverselist(list *head)
    {
      if ((NULL == head) || (NULL == head->next))
      {
        return head;
      }
      list *p1=head, *p2=p1->next, *p3=NULL;
      p1->next = NULL;
      while (p2)
      {
        p3 = p2->next;
        p2->next = p1;
        p1->prior = p2;
        p1 = p2;
        p2 = p3;
      }
      head = p1;
      return head;
    }
        不带头结点的链表逆序与带头结点的区别在于红色部分代码,即初始p1指向的是第一个结点而不是头结点,最后head直接指向p1而不是用其next来指向p1。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。