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


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

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

Guess you like

Origin blog.csdn.net/m0_53804791/article/details/119521564