输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:递归
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reversePrint(head *ListNode) []int{
if head==nil {//递归结束条件
return nil
}
return append(reversePrint(head.Next),head.Val)//将head的val加上递归调用的结果上
}

解法二:两次遍历
func reversePrint(head *ListNode) []int {
l:=0
for p:=head;p!=nil;p=p.Next{
l++ //记录长度
}
res:=make([]int,l)
for head!=nil {
res[l-1]=head.Val//从尾到头存放val
head=head.Next
l--
}
return res
}

解法三:反转链表
func reversePrint(head *ListNode) []int {
pre:=new(ListNode)
//反转链表
for head!=nil{
pre,head,head.Next=head,head.Next,pre
}
//遍历链表
nums:=make([]int,0)//申请一个数组
for pre.Next!=nil{
nums=append(nums[:],pre.Val)
pre=pre.Next
}
return nums
}

解法四:利用 栈 的先入后出
import "container/list"
func reversePrint(head *ListNode) []int {
if head == nil {
return nil
}
res := list.New()
for head != nil {
res.PushFront(head.Val)
head = head.Next
}
ret := []int{}
for e := res.Front(); e != nil; e = e.Next() {
ret = append(ret, e.Value.(int))
}
return ret
}


556

被折叠的 条评论
为什么被折叠?



