剑指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