输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 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 }