剑指offer06.从尾到头打印链表

这篇博客介绍了两种从尾到头打印链表的方法。第一种是通过反转链表,然后逐个输出节点值;第二种是先遍历链表获取节点数量,再反向填充数组并返回。代码示例分别展示了这两种实现方式,但考虑到递归可能导致栈溢出,推荐使用反转链表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


提示:
若是面试遇到此题,最好先向面试官确认是否可以改变链表的结构,

1. 改变链表结构的解法

我们可以想到,先反转链表然后在一个一个的输出
不熟悉反转链表的建议先去看一下反转链表
反转链表的经典四句
t = pre.Next
pre.Next = cur
cur = pre
pre = t

 func reversePrint(head *ListNode) []int {
// 反转链表然后再输出数组
    if head == nil {
        return nil
    }
    var cur *ListNode = nil
    pre := head
    var t *ListNode
    for pre != nil {
        t = pre.Next
        pre.Next = cur
        cur = pre
        pre = t
    }
    res := make([]int,0)
    for cur != nil{
        res = append(res,cur.Val)
        cur = cur.Next
    }
    return res
}

2.可以使用栈,递归,或者直接反向输出数组

递归有一个缺点是,当链表足够长的时候,函数的调用栈可以会爆
所以不建议使用
栈的特点先进后出也可以实现但是Go语言中没有现成的栈类型
需要自己实现比较麻烦,其他语言有栈的类型就比较方便
这里讲解一下如何反向输出数组
解题步骤 :
1.先遍历链表统计出节点的个数count
2.再循环count次,将链表中的节点的data域依次加入到数组中
3.返回数组就成功实现了反转输出

func reversePrint(head *ListNode) []int {
	// 统计节点个数然后反转数组
	if head == nil{
        return nil
    }
    count := 0
    for p := head;p != nil;p = p.Next{
        count++
    }
    array := make([]int,count)
    for ;head != nil ;head = head.Next{
        array[count - 1] =head.Val 
        count--
    }
    return array
}

注意数组下标不要越界哦 所以是count - 1
切片[]int是引用类型,零值为空所以可以返回nil

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gopher333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值