剑指 Offer 06. 从尾到头打印链表

剑指 Offer 06. 从尾到头打印链表

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

示例 1:数组

输入:head = [1,3,2]
输出:[2,3,1]

思路

golang

1.借助一个数组tmp暂存链表中的数据,再将tmp数组中的值翻转
时间复杂度:遍历了链表,因此为O(n)
空间复杂度:借助了临时数组tmp,因此为O(n)app

func reversePrint(head *ListNode) []int {
	var tmp = []int{}
	cur := head
	for cur != nil {
		tmp = append(tmp, cur.Val)
		cur = cur.Next
	}

	//翻转数组
	for i, j := 0, len(tmp)-1; i < j; i,j=i+1,j-1{
		tmp[i], tmp[j] = tmp[j], tmp[i]
	}

	return tmp
}

2.在1中还须要翻转数组,能不能直接将从链表遍历的值从最后一位开始往前存放呢?先放入的最后取,这不就是 的特性吗,而后将栈中的数据存入结果数组中。这里面用到了 container/list函数

func (l *List) PushFront(v interface{}) *Element

PushFront函数将一个值为v的新元素插入链表的第一个位置,返回生成的新元素。code

func (l *List) Front() *Element

Front函数返回链表第一个元素或nil。ip

func reversePrint(head *ListNode) []int {
    //建立一个新的链表
    l := list.New()
    for head != nil {
        //PushFront将一个值为v的新元素插入链表的第一个位置,返回生成的新元素。
        l.PushFront(head.Val)
        head = head.Next
    }

    result := []int{}
    //Front返回链表的第一个元素或者nil
    for e := l.Front(); e != nil; e = e.Next() {
        result = append(result, e.Value.(int))
    }
    return result
}

js

1.使用js的库函数unshift直接追加元素到数组的首部leetcode

unshift() 在数组开头添加一个或多个元素,并返回数组的新长度。get

/*1.使用js的库函数,unshift追加元素到达数组的首部*/
var reversePrint = function(head) {
    let array = [];
    let cur = head;
    while(cur !== null){
        array.unshift(cur.val);
        cur = cur.next;
    };
    return array;
};

2.借助一个数组tmp暂存链表中的数据,再将tmp数组中的值翻转(js的库函数reverseio

/*2.借助一个数组tmp暂存链表中的数据,再将tmp数组中的值翻转(js的库函数`reverse`) */
var reversePrint = function(head){
    let array = [];
    let cur = head;
    while(cur !== null){
        array.push(cur.val)
        cur = cur.next
    };
    return array.reverse();
}
相关文章
相关标签/搜索