单链表的建立,并进行原地逆置

单链表的建立,并进行原地逆置

问题描述:

单链表中数据原来是非递减排列的数据,请设计算法实现将其数据原地逆置
提示:要有create函数进行单链表的建立

代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct link_node 
{
    datatype info;
    struct link_node* next;
}node,*linklist;
linklist createList()
{
    datatype x;
    linklist L;
    char ch;
    L = (linklist)malloc(sizeof(node));
    if (L == NULL)
    {
        printf("error");
        return 0;
    }
    linklist n,p;
    p = L;
    printf("请输入整数系列:\n"); //输入系列并以回车结束
    while(1)
    {
        scanf_s("%d",&x,1);
        n = (linklist)malloc(sizeof(node));
        n->info = x;
        n->next = NULL;
        p->next = n;
        p = n;
        if( (ch=getchar()) == '\n') break;
    }
    return L;
}
void print(linklist head)
{
    linklist p;
    p = head->next;
    while(p)
    {
        printf("%d ",p->info);
        p = p->next;
    }
    printf("\n");
}
//翻转
linklist reverse(linklist head)
{
    linklist p,t,k;
    p = head->next;
    t = p->next;
    p->next = NULL;
    while(t)
    {
        k = t->next;
        head->next = t;
        t->next = p;
        p = t;
        t = k;
    }
    return head;
}
//释放内存
void release(linklist head)
{
    linklist p;
    while(head)
    {
        p = head->next;
        free(head);
        head = p;
    }
}
 
int main()
{
    linklist head = createList();
    print(head);
    head = reverse(head);
    printf("逆序后:");
    print(head);
    release(head);
    return 0;
}
 

带头结点,将第二个节点不断插入到头结点后面