題目:
輸入一個鏈表,按鏈表從尾到頭的順序返回一個ArrayList。
思路
鏈表從尾到頭範圍一個ArrayList,我們定義一個空數組,向數組裏添加head的每一項,添加方式有兩種:
unshift 向數組頭部添加
push 向數組尾部添加
那麼我們若想從尾到頭添加,unshift只需要返回res,push返回res.reserve()
代碼
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function printListFromTailToHead(head)
{
// write code here
const res=[];
while(head!==null){
res.unshift(head.val);
head=head.next;
}
return res;
}
拓展:數組的棧方法與隊列方法:
棧方法
- push():push可以接收任意數量的參數,把它們逐個添加到數組末尾,並返回修改後數組的長度
- pop():pop方法則從數組末尾移除最後一項,減少數組的length值,然後返回移除的項。
var colors = new Array(); // 創建一個數組
var count = colors.push("red", "green"); // 推入兩項
alert(count); //2
count = colors.push("black"); // 推入另一項
alert(count); //3
var item = colors.pop(); // 取得最後一項
alert(item); //"black"
alert(colors.length); //2
隊列方法
- unshift(): unshift方法在數組前端添加任意個項並返回新數組的長度
- shift(): shift方法移除數組中的第一個項並返回該項,同時將數組長度減一
結合使用 shift()和 push()方法,可以像使用隊列一樣使用數組。
即:數組的前端移除項,從數組末端添加項
同時使用 unshift()和 pop()方法,可以從相反的方向來模擬隊列,
即在數組的前端添加項,從數組末端移除項
鏈表
鏈表是物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表的指針地址實現,每個元素包含兩個節點,一個是存儲元素的數據域(內存空間),另一個是指向下一個節點的指針域,根據指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環鏈表等等
鏈表的優點:
鏈表是一種很常見的一種數據結構,不需要初始化容量,可以任意加減元素;
添加或者刪除元素時只需要改變前後兩個元素節點的指針域指向地址即可,所以添加,刪除很快。
缺點
含有大量的指針域,佔用空間較大;
查找元素需要遍歷鏈表來查找,非常耗時
適用場景
數據量較小,需要頻繁增加、刪除操作的場景
前端鏈表 LinkedList類