你正在參與一個專案,要為繁忙的鐵路網開發一套列車調度系統。
你接到的任務是為調度系統中的列車路線開發一個原型。 每條路線由一連串車站組成,也就是某一班列車沿途停靠的車站序列。
你的團隊決定用雙向鏈結串列來表示時刻表上的每一條火車路線。火車路線上每一站,都會用鏈結串列中的一個節點來表示。
你不需要煩惱各站的抵達和出發時間。每一站單純用一個數字來表示就好。
路線可以延伸,在路線的開頭或結尾加入車站。路線也可以縮短,把開頭或結尾的車站移除。
有時候某個車站會關閉,這時就必須把這個車站從路線中移除,即使它不在路線的開頭或結尾也一樣。
路線的大小不是用火車行駛的距離來衡量,而是看它停靠幾站。
鏈結串列是電腦科學中一種基礎的資料結構,也常用來實作其他資料結構。 顧名思義,它是一串彼此鏈結在一起的節點。 它是由「節點」組成的串列,每個節點會連接到它的一個或多個鄰居。 在單向鏈結串列中,每個節點只連接到它後面那個節點。 在雙向鏈結串列中,每個節點同時連接到它前面的節點和它後面的節點。
如果你想更深入了解鏈結串列,可以看看這篇文章,裡面用漂亮的圖解來說明。
你將要撰寫一個雙向鏈結串列的實作。
實作一個 Node 來保存值,以及指向下一個與前一個節點的指標。
接著實作一個 List,它保存對第一個與最後一個節點的參照,並提供新增和移除項目的函式。
你的 Node 應該要有下列欄位和方法:
Value:節點的值(我們會使用any)。Next() *Node:指向下一個節點的指標。Prev() *Node:指向前一個節點的指標。你應該要有一個函式 NewList(),它會建立並回傳一個 List:
NewList(args ...any) *List:建立一個新的鏈結串列,並保留值的順序。你的 List 應該要有下列方法:
First() *Node:回傳指向第一個節點(頭)的指標。Last() *Node:回傳指向最後一個節點(尾)的指標。Push(v any):在鏈結串列的尾端插入值。Pop() (any, error):從鏈結串列的尾端移除值。Unshift(v any):在鏈結串列的前端插入值。Shift() (any, error):從鏈結串列的前端移除值。Reverse():反轉這個鏈結串列。