单链表逆转

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表逆转相关的知识,希望对你有一定的参考价值。

参照:http://www.cnblogs.com/bluestorm/p/3167424.html

技术分享

#include <stdio.h>
#include <stdlib.h>
struct list{
    char data;
    struct list *next;
}node;
struct list* input()
{
    //p作为新结点,q不断连接新结点,h作为首结点返回
    struct list *p,*q,*h = NULL;
    while(1)
    {
        //新创建一个结点
        p = (struct list*)malloc(sizeof(node));
        scanf("%c",&p->data);
        p->next = NULL;
        if(p->data == \\n)//此处不为‘\\r‘
            break;
        if(h == NULL)
        {
            h = q = p;
        }
        else{
            q->next = p;
            q = p;
        }
    }
    return h;
}
void display(struct list* pfirst)
{
    struct list *p = pfirst;
    while(p)
    {
        putchar(p->data);
        p = p->next;
    }
    puts("");
}
//1借助辅助空间
//建立临时的新链表,将新结点指向其前驱结点实现逆转
//struct list* reverse(struct list* Afirst)
//{
//    struct list *p,*h = NULL,*first = Afirst;
//    while(first)
//    {
//        p = (struct list*)malloc(sizeof(node));
//        p->data = first->data;
//        if(h == NULL)//第一个结点
//        {
//            h = p;
//            h->next = NULL;
//        }
//        else{
//            p->next = h;
//            h = p;
//        }
//        first = first->next;
//    }
//    return h;
//}
//2.头尾互换,指针指向反转
struct list* reverse(struct list* Afirst)
{
    struct list *p,*q,*h,*listen;
    p = listen = Afirst;
    q = NULL;
    //使listen指向最后一个结点
    while(listen->next)
        listen = listen->next;
    //p所指的结点始终串接在listen后面,q所指的结点则接在p后面,h则记住p在串接前的下一个结点
    while(p != listen)
    {
        h = p->next;
        listen->next = p;
        if(q == NULL)
        {
            q = p;
            q->next = NULL;
        }
        else{
            p->next = q;        
            q = p;
        }
        p = h;
    }
    return listen;
}
int main()
{
    struct list *Afirst,*Bfirst;
    Afirst = input();
    puts("逆转前:");
    display(Afirst);
    Bfirst = reverse(Afirst);
    puts("逆转后:");
    display(Bfirst);
    return 0;

}

 

以上是关于单链表逆转的主要内容,如果未能解决你的问题,请参考以下文章

6-1 单链表逆转

单链表的逆转

6-1 单链表逆转(20 分)

PTA 单链表分段逆转

List习题单链表逆转

单链表逆转