【Golang】LeetCode-剑指Offer-面试题09-面试题06-从尾到头打印链表【三种解法】

题目

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

示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制: 0 <= 链表长度 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof

解法一:遍历两次head

解题思路:第一次记录链表的数量,第二次进行将链表中的值取出并逆序摆放进数组

–执行用时:0 ms --内存消耗:2.8 MB

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reversePrint(head *ListNode) []int {
    cur:=head//备份链表
    n:=0
    //遍历链表记录链表数
    for head!=nil{
        head=head.Next
        n++
    }
    //再次遍历链表逆序摆放进数组
    nums:=make([]int,n)//申请一个数组,n可作用在这里预申请空间,大大减少了内存消耗
    for {
        if cur==nil{
            break
        }
        nums[n-1]=cur.Val
        cur=cur.Next
        n--
    }
    return nums
}

解法二:反转链表后再按序加入数组

–执行用时:4 ms --内存消耗:3.1 MB

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
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
}

解法三:递归解法

–执行时间:4 ms–消耗内存:4.6 MB

(代码简洁,但相对于执行时间和内存消耗,都要比“代码量最多的解法一”多)

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reversePrint(head *ListNode) []int {
    if head == nil {
        return []int{}
    }
    return append(reversePrint(head.Next), head.Val)
}

在LeetCode该题中,我也有提交题解,欢迎查看。昵称:Sakura。

你可能感兴趣的:(LeetCode力扣个人题解)