单链表反转/逆序

来源:互联网 发布:都市小说改编的网络剧 编辑:程序博客网 时间:2024/05/29 17:30

单链表反转 / 逆序有两种方法:非递归法和递归法,下面介绍两种方法的实现过程。

单链表结构定义如下:

typedef struct node{    int data;   //数据域    struct node *next;  //指针域,存储下一个结点的地址}L, *ListP;

非递归方法

将头结点的下一个结点指向头结点,然后将头结点指向它的下一个结点,重复此过程,直到头结点的下一个结点为NULL。移动过程中需要保存头结点的下一个结点,具体过程如下图。


实现代码:

ListP* ReverseList(ListP* head)  {      if (!head || !head->next)   // 链表空或只有一个结点      {          return head;      }      Node* p = head;      Node* q = p->next;      // 保存头结点的下一个结点    head->next = NULL;      while (q)      {           p = q;          q = q->next;    // 移动指针p和q        p->next = head;     // 接上新的结点         head = p;       // 更新头结点    }      return head;  }  

递归方法

将最后一个结点作为新的头结点,依次将前面的结点连接到新的头结点后面。


实现代码:

ListP* ReverseList(ListP* head)  {      if (!head || !head->next)   // 链表空或只有一个结点      {          return head;      }       Node* newhead = ReverseList(head->next);      // 最后一个结点作为新的头结点    head->next->next = head;    //  头结点接到新的头结点后面    head->next = NULL;    return newhead;  }  

0 0
原创粉丝点击