剑指offer(面试题5):单链表的逆序打印

链表呢是一个就是一些 包含数据的独立数据结构通话常会称为节点的集合(每个节点在定义是都会为一个结构体)!!

那单链表即每个节点都包含指向下一个节点的指针(亦为结构体的指针)。并且链表的最后一个节点指向空NULL。所以当你找到链表的第一个节点的位置后我们就可以找到这个链表的所有节点!!单链表有一个很重要的特点就是我们只能从头结点开始位置遍历链表直到结尾位置,但链表无法从相反方向遍历!!这是非常重要的,这直接决定我们是不可以通过遍历这种方法逆序打印单链表的!!
那么我们要怎么样去逆序打印单链表呢!!其实是有很多种方法的!不过其实本人才刚开始学数据结构目前只了解了一种方法那就是用递归!!

首先我们先来定义一个结构体

typedef char LinkType
typedef struct LinkNode
{
    LinkType value;//结构体内保存的数据
    struct LinkType *node;//定义了一个结构体的指针指向下一个节点
}LinkNode;//结构体的变量

LinkNode *head;//定义了一个结构体的指针

首先我们要初始化一个单链表并且在这个单链表里插入节点,才能对它排序啊对不对!!!

//初始化函数
void LinkNodeInit(LinkNode **head)//这里我们一定要传一个二级指针
{
    *head=NULL;
}

//尾插函数
void LinkNodePushBack(LinkNode **head, LinkType value)
{
    if (head == NULL)
    {
        return;
    }
    if (*head == NULL)
    {
        //此时为对空链表尾插
        LinkNode *ptr = (LinkNode *)malloc(sizeof(LinkNode));
        ptr->next = NULL;
        ptr->value = value;
        *head = ptr;
        return;
    }
    LinkNode *cur = *head;
    while (cur->next != NULL)
    {
        cur = cur->next;
    }
    LinkNode *ptr = (LinkNode *)malloc(sizeof(LinkNode));
    ptr->next = NULL;//初始化新开辟的链表
    ptr->value = value;
    cur->next = ptr;
    return;
}

//逆序打印函数
void LinkNodeReverse(LinkNode *head)
{
    if (head == NULL)
    {
        //空链表不打印
        return;
    }
    LinkNode *cur = head;
    if (cur != NULL)
    {
        LinkNodeReverse(cur->next);
    }
    printf("%p------->%c\n", &cur->value, cur->value);
}

int main()
{
    LinkNodeInit(&head);
    LinkNodePushBack(&head, 'a');
    LinkNodePushBack(&head, 'b');
    LinkNodePushBack(&head, 'c');
    LinkNodePushBack(&head, 'd');
    LinkNodeReverse(head);
    system("pause");
    return;
}

打印结果
这里写图片描述

首先我们在尾插的时候一定要传入一个二级指针,这是因为函数在传参的时候实参是对形参的一份拷贝,两个地地址是不一样的,所以你要是想在函数内部修改实参的值的话,一定要将实参的地址传进去,才能对实参进行修改,不然你只是对形参进行了修改而没有修改实参!!!(主要原因是实参形参地址不一样)!!!!一定要记住这个!!!

然后就是我们的重头戏函数的逆序打印(递归)
函数在递归的时候一个一个的压栈,因为栈是先进后出的原则所以在出栈的时候最后一个节点先打印然后是倒数第二个,倒数第三个······依次倒序打印

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值