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

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   
#include   
  
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");  
}  


你可能感兴趣的:(已知链表的头结点head,写一个函数把这个链表逆序)