单链表(L1→L2→...→Ln) 重排为(L1→Ln→L2→Ln-1→L3→Ln-2...)

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode{
    int data ;
    struct LNode *next ;
}LNode , *LinkList;

LinkList Createlist( LinkList L){
    int num ;
    LNode *p , *r = L ;
    printf("请输入数据:\n");
    scanf("%d",&num) ;
    while( num!= -1 ){
        p = (LNode *)malloc(sizeof(LNode));
        p->data = num ;
        r->next = p ;
        r = p ;
        scanf("%d",&num) ;
    }
    r->next = NULL ;
    return L ;
}

void ViewLinklist( LinkList L ){
    LNode *p = (LNode *)malloc(sizeof(LNode));
    p = L->next ;
    printf("链表为:");
    while( p->next ){
        printf("%d ->",p->data);
        p = p->next ;
    }
    printf("%d",p->data);
}

LinkList Reverse( LinkList L ){
    LNode *p , *r , *q ;
    p = L->next ;
    while(p!=NULL){
        q = p ->next ;
        while( q==NULL || q->next==NULL )
            return L ;
        while(q->next->next!=NULL)
            q = q->next ;            //每次遍历到尾结点,将其摘下
        r = q->next ;
        q->next = NULL ;
        r->next = p->next ;
        p->next = r ;
        p = r->next;                 //p是行动指针,将摘下结点插入其后
    }
    return L;
}

int main()
{
    LinkList L = (LinkList )malloc(sizeof(LNode));
    Createlist( L ) ;
    ViewLinklist(L);
    printf("\n");
    Reverse(L);
    ViewLinklist(L);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/RRWJ__/article/details/82954898