单链表的逆序输出及就地逆置

单链表的逆序输出:

void R_Print(LinkList L){
        if(L->next) R_print(L->next);
        print(L->data);
}

单链表的就地逆置:

就地逆置即空间复杂度为O(1)

解法一:

将头结点摘下,然后从第一结点开始,依次前插入到头结点的后面(头插法建立单链表),直到最后一个结点为止

LinkList Reverse_1(LinkList L){
    LNode *p,*r;//p为工作指针,r为p的后继,以防断链
    p=L->next;//从第一个元素结点开始
    L->next=NULL;//将L的next域置为null
    while(p!=NULL){
        r=p->next;//暂存p的后继
        p->next=L->next;//将p结点插入到头结点之后
        L->next=p;
        p=r;
    }
    return L;
}

解法二:

假设pre,p和r指向3个相邻的结点,假设经过若干操作,*pre之前的结点的指针都已调整完毕,他们的next都指向其原前驱结点。现在令*p结点的next域指向*pre结点,为防止*p的后继结点断开,用r来指向原*p的后继结点。


处理时注意两点:

一,在处理第一个结点时,应将next域置为NULL,应为要作为新表的尾结点

二,处理完最后一个结点,要将头结点的指针指向它。

LinkList Reverse_2(LinkList L){
    LNode *pre,*p=L->next,*r=p->next;
    p=L->next;//处理第一个结点
    while(r!=NULL){//r为空 说明p为最后一个结点
        pre=p;//依次遍历
        p=r;
        r=r->next;
        p->next=pre;//将指针反转
    }
    L->next=p;//处理最后一个结点
    return L;
}


  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值