[基礎]
不論是array或link list都是建立資料間的關聯性的方式。
Array是"你在記憶體中在我旁邊,所以我們是一組的、相關的"
和array的不同,link list中的資料們可以散落在記憶體中不相鄰的地方。而彼此間的關聯是藉由link來維繫。
最常見的例子是這個
Struct Node{
Node* next;
int val;
};
每個node都擁有一個pointer to next node,資料間的關聯性就是靠它來維繫,它就是"link"。如果node很多的時候,一個指向下一個,就成為長長的一條link "list"。
[進階]
很多人認為link list的重點在建立pointer,但我個人認為重點是建立"link",而pointer只是link的一種實作方式,並非絕對要用pointer。
舉例來說我可以用index當link
Struct Node{
int next;//下一個node的index
int val;
};
Void main(){
Node n[4];
int list_head_idx=2;
n[2].next = 3;
n[3].next = 1;
n[1].next = 0;
n[0].next = -1;
}
這麼一來我就建立了一個順序為n[2] n[3] n[1] n[0]的list。
我一樣可以享有"只要修改link即可完成插入/刪除"的這個好處。
而且還可以額外擁有"快速access特定idx的node"的好處。
這些好處可以用在什麼題目上,大家可以好好想想。我這邊舉一個我可以想到的是union-find的題目用這個會很方便。
(不過也有array無法隨意擴展大小的問題)
這個例子打開了我們的對於"link"的想像力,你只要能建立起資料間的link,不論是用pointer或是index或什麼其他技巧,都可以建立起link list。
[總結一下]
link list就是透過link來建立資料間的關聯性,link一般用pointer來做,但你可以發揮巧思用其它方式比如說index來當link,看看會有甚麼額外的優點,以及額外的代價喔。