劍指 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();
}
相關文章
相關標籤/搜索