输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

 

示例 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
}