已知链表的头结点head,写一个函数把这个链表逆序

来源:互联网 发布:热力图软件 编辑:程序博客网 时间:2024/05/18 00:50
Node * ReverseList(Node *head) //链表逆序{if ( head == NULL || head->next == NULL )return head;Node *p1 = head ;Node *p2 = p1->next ;Node *p3 = p2->next ;p1->next = NULL ;while ( p3 != NULL ){p2->next = p1 ;p1 = p2 ;p2 = p3 ;p3 = p3->next ;}p2->next = p1 ;head = p2 ;return head ;}


上述代买有问题,不能实现整个的逆序;

思路应该为: 

若链表为空或只有一个元素,则直接返回;

  2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;

  3). 重复2),直到q为空

  4). 调整链表头和链表尾


#include <stdio.h>  #include <stdlib.h>    typedef struct tagListNode{      int data;      struct tagListNode* next;  }ListNode, *List;    void PrintList(List head);  List ReverseList(List head);    int main()  {      //分配链表头结点      ListNode *head;      head = (ListNode*)malloc(sizeof(ListNode));      head->next = NULL;      head->data = -1;        //将[1,10]加入链表      int i;      ListNode *p, *q;      p = head;      for(int i = 1; i <= 10; i++)      {          q = (ListNode *)malloc(sizeof(ListNode));          q->data = i;          q->next = NULL;          p->next = q;          p = q;              }        PrintList(head);           /*输出原始链表*/      head = ReverseList(head);  /*逆序链表*/      PrintList(head);           /*输出逆序后的链表*/      return 0;  }    List ReverseList(List head)  {      if(head->next == NULL || head->next->next == NULL)        {         return head;   /*链表为空或只有一个元素则直接返回*/      }        ListNode *t = NULL,               *p = head->next,               *q = head->next->next;      while(q != NULL)      {                t = q->next;        q->next = p;        p = q;        q = t;      }        /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/      head->next->next = NULL;  /*设置链表尾*/      head->next = p;           /*调整链表头*/      return head;  }    void PrintList(List head)  {      ListNode* p = head->next;      while(p != NULL)      {          printf("%d ", p->data);          p = p->next;      }      printf("/n");  }  


原创粉丝点击