1、鏈表
雙向鏈表:每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)[指針],分別指向直接后繼和直接前驅(qū)
單向鏈表:鏈表的鏈接方向是單向的,對(duì)鏈表的訪問(wèn)要通過(guò)順序讀取從頭部開始;鏈表是使用指針進(jìn)行構(gòu)造的列表;又稱為結(jié)點(diǎn)列表,因?yàn)殒湵硎怯梢粋€(gè)個(gè)結(jié)點(diǎn)組裝起來(lái)的;其中每個(gè)結(jié)點(diǎn)都有指針成員變量指向列表中的下一個(gè)結(jié)點(diǎn)
循環(huán)鏈表:表中最后一個(gè)結(jié)點(diǎn)的指針域指向頭結(jié)點(diǎn),整個(gè)鏈表形成一個(gè)環(huán)
class LinkList {
var value: Int
var next: LinkList?
var before:LinkList?(雙向鏈表)
init(_ val: Int) {
value = val
}
}
增刪改查操作 修改鏈表的指針的指向
隊(duì)列:是一種采用先進(jìn)先出(FIFO)策略的抽象數(shù)據(jù)結(jié)構(gòu)
通常使用鏈表形式來(lái)實(shí)現(xiàn)隊(duì)列,使用單向鏈表來(lái)實(shí)現(xiàn)鏈?zhǔn)疥?duì)列,鏈?zhǔn)疥?duì)列中存儲(chǔ)front和rear即可
http://blog.csdn.net/juanqinyang/article/details/51354293
typedef struct node
{
int val;
struct node *next;
}Node;
typedef struct queue
{
Node *front;
Node *rear;
};
判斷隊(duì)列是否為空:
bool IsEmpty(Queue *q)
{
return (q->front == q->rear);
}
棧(stack)在計(jì)算機(jī)科學(xué)中是限定僅在表尾進(jìn)行插入或刪除操作的線性表。棧是一種數(shù)據(jù)結(jié)構(gòu),它按照后進(jìn)先出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時(shí)候從棧頂開始彈出數(shù)據(jù)。棧是只能在某一端插入和刪除的特殊線性表。
2、Swift算法實(shí)現(xiàn)之鏈表倒數(shù)第k個(gè)結(jié)點(diǎn)
使用兩個(gè)指針實(shí)現(xiàn),首先將第一個(gè)指針pNode前進(jìn) k 步,然后qNode才開始前進(jìn),后面pNode、qNode同時(shí)往前移動(dòng),當(dāng)pNode指向尾結(jié)點(diǎn)時(shí),pNode指向的結(jié)點(diǎn)就是倒數(shù)第k個(gè)結(jié)點(diǎn)
3、數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的數(shù)字(轉(zhuǎn)自http://www.imlifengfeng.com/blog/?p=652)
解法1:先將數(shù)組進(jìn)行排序,排過(guò)序之后求數(shù)組中間的那個(gè)數(shù)字,該數(shù)字就是那個(gè)出現(xiàn)次數(shù)超過(guò)一半的數(shù)字
解法2:借助 hash 表實(shí)現(xiàn),hash 表的鍵值(Key)為數(shù)組中的數(shù)字,值(Value)為該數(shù)字對(duì)應(yīng)的次數(shù)。然后直接遍歷整個(gè) hash 表 ,找出每一個(gè)數(shù)字在對(duì)應(yīng)的位置處出現(xiàn)的次數(shù),輸出那個(gè)出現(xiàn)次數(shù)超過(guò)一半的數(shù)字即可。
解法3:遍歷數(shù)組,比較相鄰的兩個(gè)數(shù)字,如果這兩個(gè)數(shù)字不相等則同時(shí)刪除這兩個(gè)數(shù)字(不管是不是我們要查找的那個(gè)出現(xiàn)次數(shù)超過(guò)一半的數(shù)字),如果相等則保留這兩個(gè)數(shù)字,從這兩個(gè)數(shù)字中的后一個(gè)數(shù)字繼續(xù)往后遍歷,最后剩余的數(shù)字就是那個(gè)出現(xiàn)次數(shù)超過(guò)一半的數(shù)字。
解法4:在遍歷數(shù)組的時(shí)候保存兩個(gè)值:num(用來(lái)保存數(shù)組中遍歷到的某個(gè)數(shù)字)和count(用來(lái)表示當(dāng)前數(shù)字的出現(xiàn)次數(shù)),count初始化為1。當(dāng)我們遍歷到數(shù)組中下一個(gè)數(shù)字的時(shí)候:
如果下一個(gè)數(shù)字與之前num保存的數(shù)字相同,則count加1;
如果下一個(gè)數(shù)字與之前num保存的數(shù)字不同,則count減1;
每當(dāng)出現(xiàn)次數(shù)count變?yōu)?后,用num保存下一個(gè)數(shù)字,并把count重新設(shè)為1。 直到遍歷完數(shù)組中的所有數(shù)字為止。
4、逐字翻轉(zhuǎn)字符串 ”the sky is blue”—>”blue is sky the”
兩次翻轉(zhuǎn):
第一次翻轉(zhuǎn),整體翻轉(zhuǎn):”the sky is blue” -> “eulb si yks eht”
第二次翻轉(zhuǎn),單詞翻轉(zhuǎn):”eulb si yks eht” -> “blue is sky the”
5、LRU算法 緩存淘汰算法(最近最少使用)http://flychao88.iteye.com/blog/1977653
最常見的實(shí)現(xiàn)是使用一個(gè)鏈表保存緩存數(shù)據(jù)
- 新數(shù)據(jù)插入到鏈表頭部;
- 每當(dāng)緩存命中(即緩存數(shù)據(jù)被訪問(wèn)),則將數(shù)據(jù)移到鏈表頭部;
- 當(dāng)鏈表滿的時(shí)候,將鏈表尾部的數(shù)據(jù)丟棄。
6、MRU(最近最常使用算法)