单向链表的逆序,不使用额外节点存储实现

链表的逆序是常见考题,今天来简单学习使用如何实现单向链表的逆序。

逆序过程

初始链表状态
这里写图片描述

初始状态,prev是NULL,head指向当前的头节点A,next指向A节点的下一个节点B。首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的next已经指向B节点了,因此修改A节点的next指针不会导致链表丢失)。逆向节点A之后,链表的状态如图(2)所示:
这里写图片描述

用这种方法依次向后逆序就可以了

逆序代码示例

结合上面图示理解

struct node *reverse(struct node *head)
{
    struct node *prev;//指向逆序完的链表的第一个节点
    struct node *next;//指向将要实现逆序的节点

    prev = NULL;

    while(head != NULL)
    {
        next = head->next;//把未逆序的head指向的节点的下一个节点让next保存,建立当前未逆序节点和下一个未逆序节点的链接
        head->next = prev;//让head指向的节点的下一个节点保存prev指向的节点,建立上一个逆序节点和当前未逆序节点的链接
        prev = head;//把head指向的节点让prev保存,逆序节点头指针前移
        head = next;//next指向的节点让head保存,未逆序指针头结点后移
    }
    return prev;//逆序完成的头结点是prev,返回
};

完整代码检验


/*********************************************************************************
 *      Copyright:  (C) 2017 fanmaolin<fanmaolinn@gmail.com>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值