单链表逆序详解

来源:互联网 发布:先导爱知在第五季出现 编辑:程序博客网 时间:2024/04/27 15:00

单链表逆序详解

单链表逆序详解
 
1、具有链表头的单链表
一段单链表逆序的程序 
typedef struct student
{
    int number;
    char name[20];
    int score;
    struct student *next;
}student;


student *reverse(student *stu)
{
    student *p1,*p2,*p3;
    if(stu == NULL ||stu->next == NULL)
        return stu;
    p1=stu->next;                           //p1指向链表头节点的下一个节点
    p2=p1->next;
    p1->next=NULL;
    while(p2)
    {
        p3=p2->next;
        p2->next = p1;
        p1=p2;
        p2=p3;
    }
    printf("p1 = %d,next = %d\n ",p1->number,p1->next->number);
    stu->next=p1;                           //将链表头节点指向p1
    return stu;
}

分析:
假设需要逆序的单链表为:
单链表逆序详解

则逆序以后的链表为:
单链表逆序详解

过程:
(1)取p1指向header->next                     p1=stu->next;
         p2保留p1->next                             p2=p1->next;
         将p1->next置为NULL,因为单链表逆序以后,当前的p1节点为尾节点                    p1->next=NULL;

单链表逆序详解

(2)取p3保留p2->next                       p3=p2->next;
        将p2插入p1之前                            p2->next = p1;
         p1指向p2指向的节点       p1=p2;
         p2指向p3指向的节点       p2=p3;

单链表逆序详解


循环一次修改以后的单链表如下:

单链表逆序详解

(3)重复步骤(2)
单链表逆序详解

循环一次修改以后的单链表如下:

单链表逆序详解

(4)将header->next指向p1,完成整个单链表的逆序

单链表逆序详解


2、无链表头的单链表
一段单链表逆序的程序 
typedef struct student
{
    int number;
    char name[20];
    int score;
    struct student *next;
}student;


student *reverse2(student *stu)
{
        student *p1,*p2,*p3;
        if(stu == NULL ||stu->next == NULL)
                return stu;
        p1=stu                                  //p1指向链表的第一个节点                                                  
        p2=p1->next;
    p1->next = NULL;
        while(p2)
        {
                p3=p2->next;
                p2->next = p1;
                p1=p2;
                p2=p3;
        }
        printf("p1 = %d,next = %d\n ",p1->number,p1->next->number);
        stu=p1;                                 //将链表第一个节点指向p1
        return stu;
}



原创粉丝点击