亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

數(shù)據(jù)結(jié)構(gòu)三要素拆解:鏈表12個(gè)基礎(chǔ)操作與代碼詳解

數(shù)據(jù)結(jié)構(gòu)三要素拆解:鏈表12個(gè)基礎(chǔ)操作與代碼詳解 看多了網(wǎng)上那種“數(shù)據(jù)結(jié)構(gòu)三要素背下來(lái)鏈表操作背下來(lái)”的學(xué)習(xí)方法我想說(shuō)一句實(shí)在話鏈表操作根本不是背代碼的活。如果一開(kāi)始就用數(shù)據(jù)結(jié)構(gòu)三要素的視角去拆解你會(huì)發(fā)現(xiàn)鏈表那套“增刪改查”其實(shí)是順著邏輯自己長(zhǎng)出來(lái)的。這篇文章我花點(diǎn)時(shí)間把《數(shù)據(jù)結(jié)構(gòu)三要素解析 鏈表的12個(gè)基礎(chǔ)操作代碼詳解》這個(gè)主題徹底展開(kāi)結(jié)合我早年剛啃數(shù)據(jù)結(jié)構(gòu)時(shí)踩過(guò)的坑把“既要懂原理又要能寫(xiě)代碼”這條路走通。不管你是正準(zhǔn)備期末的在校生還是想補(bǔ)內(nèi)功的轉(zhuǎn)行開(kāi)發(fā)者這篇都值得從頭到尾看完。1. 數(shù)據(jù)結(jié)構(gòu)三要素先跳出來(lái)再鉆進(jìn)去很多人在學(xué)鏈表之前其實(shí)沒(méi)弄明白“數(shù)據(jù)結(jié)構(gòu)到底在學(xué)什么”。我在初學(xué)階段也干過(guò)蠢事——拿著教材從頭背到尾定義、特性、時(shí)間復(fù)雜度背得滾瓜爛熟結(jié)果一到寫(xiě)代碼就抓瞎。后來(lái)一位算法方向的前輩點(diǎn)了我一句“你先把數(shù)據(jù)結(jié)構(gòu)的三要素搞清楚你就知道每段代碼在干嘛了。”1.1 邏輯結(jié)構(gòu)數(shù)據(jù)之間的關(guān)系是什么三要素的第一條是邏輯結(jié)構(gòu)。所謂邏輯結(jié)構(gòu)就是數(shù)據(jù)元素之間存在什么關(guān)系。這個(gè)關(guān)系是抽象的不管你用數(shù)組、鏈表還是樹(shù)形結(jié)構(gòu)去實(shí)現(xiàn)邏輯關(guān)系本身是獨(dú)立的。鏈表對(duì)應(yīng)的邏輯結(jié)構(gòu)是線性表它的特點(diǎn)是數(shù)據(jù)元素之間存在一對(duì)一的前驅(qū)后繼關(guān)系。說(shuō)得直白一點(diǎn)就是每個(gè)節(jié)點(diǎn)都有且只有一個(gè)直接前驅(qū)和一個(gè)直接后繼頭部節(jié)點(diǎn)沒(méi)有前驅(qū)尾部節(jié)點(diǎn)沒(méi)有后繼。當(dāng)初理解“邏輯結(jié)構(gòu)”這個(gè)概念的時(shí)候我用了一個(gè)特別生活化的類比排隊(duì)買(mǎi)奶茶。你前面那個(gè)人是你的直接前驅(qū)你后面那個(gè)人是你的直接后繼隊(duì)首沒(méi)有前驅(qū)隊(duì)尾沒(méi)有后繼。這個(gè)前后關(guān)系就是線性表的邏輯結(jié)構(gòu)。至于大家是站在一條水泥地上的隊(duì)伍里數(shù)組還是每個(gè)人手里拿著前一個(gè)人的衣角串成一串鏈表那是存儲(chǔ)結(jié)構(gòu)的事邏輯關(guān)系沒(méi)變。1.2 存儲(chǔ)結(jié)構(gòu)關(guān)系如何落到內(nèi)存三要素的第二條是存儲(chǔ)結(jié)構(gòu)也叫物理結(jié)構(gòu)。它解決的是“邏輯關(guān)系在計(jì)算機(jī)里怎么表示”的問(wèn)題。線性表有兩種經(jīng)典的存儲(chǔ)結(jié)構(gòu)順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)。順序存儲(chǔ)就是數(shù)組邏輯相鄰的元素在內(nèi)存里也物理相鄰。它的特點(diǎn)是“隨機(jī)存取”——給一個(gè)下標(biāo)就能直接算出地址訪問(wèn)第5個(gè)元素的代價(jià)和訪問(wèn)第5000個(gè)元素是一樣的。但它的短板也很明顯插入和刪除要搬動(dòng)大量元素而且需要一整塊連續(xù)內(nèi)存。鏈?zhǔn)酱鎯?chǔ)就是鏈表。它允許元素在內(nèi)存里東一個(gè)西一個(gè)每個(gè)節(jié)點(diǎn)除了存數(shù)據(jù)還要存一個(gè)指針指向下一個(gè)節(jié)點(diǎn)的地址。這樣邏輯相鄰的元素不需要物理相鄰靠指針就能串起來(lái)。付出的代價(jià)是不能“隨機(jī)存取”想找第5個(gè)節(jié)點(diǎn)必須從頭往后一個(gè)個(gè)跳。兩者對(duì)比下來(lái)一句話就能說(shuō)清數(shù)組是“物理相鄰換隨機(jī)訪問(wèn)”鏈表是“物理離散換靈活增刪”。1.3 數(shù)據(jù)運(yùn)算一切操作的入口定義三要素的第三條是數(shù)據(jù)運(yùn)算也就是針對(duì)這個(gè)結(jié)構(gòu)我們要支持哪些操作。在。在教材層面運(yùn)算包括建立、銷(xiāo)毀、查找、插入、刪除、修改、遍歷、求長(zhǎng)度、判空這些基本動(dòng)作。學(xué)習(xí)的關(guān)鍵在于這些運(yùn)算不是孤立的背代碼它們?nèi)拷⒃谇皟蓚€(gè)要素之上。比如“插入”這個(gè)運(yùn)算在數(shù)組里是先移動(dòng)元素再放入在鏈表里是改兩個(gè)指針——為什么不一樣就是因?yàn)榇鎯?chǔ)結(jié)構(gòu)不同。搞清楚了存儲(chǔ)結(jié)構(gòu)運(yùn)算方式就是順理成章的事。我經(jīng)常遇到讀者問(wèn)我“為什么鏈表插入的時(shí)間復(fù)雜度是O(1)但實(shí)際寫(xiě)代碼好像還要先查找到那個(gè)位置”這個(gè)問(wèn)題問(wèn)得很好。要解釋清楚就必須區(qū)分兩種操作如果你已經(jīng)有了當(dāng)前節(jié)點(diǎn)的指針那插入一個(gè)新節(jié)點(diǎn)確實(shí)是O(1)但如果你只有位置序號(hào)第一步還要從頭遍歷找節(jié)點(diǎn)遍歷是O(n)所以“按位置插入”的總代價(jià)是O(n)。這就是數(shù)據(jù)運(yùn)算和邏輯結(jié)構(gòu)交織在一起的典型案例。有了這三要素的框架再看鏈表的所有基礎(chǔ)操作你會(huì)發(fā)現(xiàn)每一段代碼都有它的“因”。下面我把整個(gè)鏈表操作的代碼工程拆開(kāi)來(lái)講所有代碼均基于C語(yǔ)言這是數(shù)據(jù)結(jié)構(gòu)教材最常見(jiàn)也最便于理解指針操作的載體。2. 鏈表操作前的三道基礎(chǔ)題結(jié)構(gòu)體設(shè)計(jì)、頭結(jié)點(diǎn)選擇、公共約定在動(dòng)手寫(xiě)12個(gè)基礎(chǔ)操作之前必須先做三件事。很多初學(xué)者代碼寫(xiě)了半天編譯不過(guò)或者各種段錯(cuò)誤90%的問(wèn)題出在這三個(gè)前置選擇上。2.1 結(jié)構(gòu)體的定義與頭結(jié)點(diǎn)之爭(zhēng)C語(yǔ)言里單鏈表節(jié)點(diǎn)的定義是這樣的// 單鏈表節(jié)點(diǎn)定義 typedef struct LNode { int data; // 數(shù)據(jù)域這里以int為例 struct LNode *next; // 指針域指向下一個(gè)節(jié)點(diǎn) } LNode; // 使用別名簡(jiǎn)化聲明LNode* 表示指向節(jié)點(diǎn)的指針這段代碼本身沒(méi)有太多懸念。真正的分歧在“要不要頭結(jié)點(diǎn)”這個(gè)問(wèn)題上。頭結(jié)點(diǎn)注意不是頭指針是鏈表第一個(gè)節(jié)點(diǎn)之前額外增加的一個(gè)節(jié)點(diǎn)。它不存有效數(shù)據(jù)placeholder只是為了統(tǒng)一操作邏輯。帶頭結(jié)點(diǎn)的鏈表頭指針永遠(yuǎn)指向那個(gè)哨兵節(jié)點(diǎn)不帶頭結(jié)點(diǎn)的鏈表頭指針直接指向第一個(gè)數(shù)據(jù)節(jié)點(diǎn)。我從實(shí)際工程經(jīng)驗(yàn)和考試兩個(gè)角度看都建議帶頭結(jié)點(diǎn)。理由很簡(jiǎn)單帶頭結(jié)點(diǎn)之后在頭部插入和刪除就不需要特殊對(duì)待了整個(gè)鏈表的所有插入刪除邏輯可以完全統(tǒng)一。這對(duì)代碼的健壯性和可讀性都有很大提升。2.2 12個(gè)基礎(chǔ)操作怎么選出來(lái)的既然標(biāo)題叫“12個(gè)基礎(chǔ)操作”我先列個(gè)清單。對(duì)單鏈表來(lái)說(shuō)真正“基礎(chǔ)”的操作圍繞增刪改查四條線展開(kāi)初始化鏈表創(chuàng)建帶頭結(jié)點(diǎn)的空鏈表判斷鏈表是否為空求鏈表長(zhǎng)度按位查找找第i個(gè)節(jié)點(diǎn)按值查找找第一個(gè)值等于x的節(jié)點(diǎn)頭插法插入節(jié)點(diǎn)尾插法插入節(jié)點(diǎn)指定位置插入節(jié)點(diǎn)按位刪除節(jié)點(diǎn)按值刪除節(jié)點(diǎn)修改指定位置節(jié)點(diǎn)的值遍歷打印鏈表這12個(gè)操作覆蓋了一個(gè)基本線性表的所有日常需求。你會(huì)發(fā)現(xiàn)它們之間有清晰的依賴關(guān)系查找是后面插入刪除的基礎(chǔ)長(zhǎng)度和判空是通用工具頭尾插入是構(gòu)造鏈表的兩種主要方式。先掌握它們后面的逆轉(zhuǎn)、排序、合并等進(jìn)階操作才能順手。2.3 每個(gè)操作都要遵守的公共約定在寫(xiě)任何一個(gè)操作之前先定下約定。不然12個(gè)函數(shù)各有各的返回值風(fēng)格寫(xiě)著寫(xiě)著就亂了。我的約定如下函數(shù)內(nèi)部操作失敗返回0或-1成功返回1布爾語(yǔ)義。查找類的函數(shù)找到返回節(jié)點(diǎn)指針找不到返回NULL。傳入的頭指針如果為NULL直接返回失敗或NULL不繼續(xù)執(zhí)行。位置參數(shù)從1開(kāi)始計(jì)數(shù)這是教材和大多數(shù)考試的統(tǒng)一規(guī)則避免和數(shù)組下標(biāo)混淆。這些約定看起來(lái)瑣碎但它保證了12個(gè)函數(shù)在組合調(diào)用的時(shí)候邏輯一致。比如“在第i個(gè)位置插入”內(nèi)部會(huì)先調(diào)“按位查找第i-1個(gè)節(jié)點(diǎn)”兩者通過(guò)位置語(yǔ)義保持一致就很少出錯(cuò)。3. 增刪改查四類基礎(chǔ)操作的代碼拆解前置工作做完開(kāi)始寫(xiě)核心代碼。這一節(jié)是全文的重頭戲我會(huì)把12個(gè)操作按依賴關(guān)系層層拆開(kāi)。每一段代碼都帶注釋注釋里寫(xiě)清“為什么這么做”。3.1 按位查找與按值查找一切操作的地基查找操作是整個(gè)鏈表的基石。插入和刪除的前置步驟基本都是“找到目標(biāo)節(jié)點(diǎn)的前驅(qū)”。按位查找的代碼// 按位查找返回第i個(gè)節(jié)點(diǎn)的指針 // 約定i從1開(kāi)始計(jì)數(shù)不包括頭結(jié)點(diǎn) LNode* GetElem(LNode L, int i) { if (i 1) { return NULL; // 位置不合法 } LNode *p L; // p指向當(dāng)前掃描到的節(jié)點(diǎn)從第0個(gè)頭結(jié)點(diǎn)開(kāi)始 int j 0; // j記錄p是第幾個(gè)節(jié)點(diǎn) while (p ! NULL j i) { p p-next; j; } // 如果p為NULL說(shuō)明i超出了鏈表長(zhǎng)度否則p就是第i個(gè)節(jié)點(diǎn) return p; }這里有個(gè)細(xì)節(jié)值得說(shuō)透為什么從第0個(gè)頭結(jié)點(diǎn)而不是第1個(gè)節(jié)點(diǎn)開(kāi)始跳因?yàn)椴檎业趇個(gè)節(jié)點(diǎn)需要移動(dòng)i次。帶頭結(jié)點(diǎn)的情況下從head出發(fā)走i步正好停在第i個(gè)節(jié)點(diǎn)上。這個(gè)“偏移量”思維是整個(gè)鏈表操作最核心的數(shù)學(xué)基礎(chǔ)。按值查找的代碼// 按值查找返回第一個(gè)值為x的節(jié)點(diǎn)指針 LNode* LocateElem(LNode L, int x) { LNode *p L-next; // 從第一個(gè)數(shù)據(jù)節(jié)點(diǎn)開(kāi)始 while (p ! NULL) { if (p-data x) { return p; // 找到返回指針 } p p-next; } return NULL; // 沒(méi)找到 }這段代碼沒(méi)有什么高深技巧但注意一點(diǎn)遍歷時(shí)不要把p移動(dòng)完再判斷要邊移動(dòng)邊判斷邊退出。習(xí)慣了循環(huán)寫(xiě)全量的同學(xué)很容易把結(jié)束條件寫(xiě)成遍歷完整個(gè)鏈表白白浪費(fèi)CPU還丟失了“第一個(gè)匹配項(xiàng)”的語(yǔ)義。3.2 頭插法、尾插法與指定位置插入三個(gè)層次的插入插入操作是鏈表靈活性的集中體現(xiàn)。我按“頭、尾、指定位置”三個(gè)層次來(lái)講。頭插法在頭結(jié)點(diǎn)后面直接插入新節(jié)點(diǎn)// 頭插法在頭結(jié)點(diǎn)后插入新節(jié)點(diǎn)插到鏈表最前面 int HeadInsert(LNode *L, int x) { LNode *s (LNode*)malloc(sizeof(LNode)); // 創(chuàng)建新節(jié)點(diǎn) if (s NULL) { return 0; // 內(nèi)存分配失敗 } s-data x; s-next L-next; // 新節(jié)點(diǎn)指向原來(lái)的第一個(gè)數(shù)據(jù)節(jié)點(diǎn) L-next s; // 頭結(jié)點(diǎn)指向新節(jié)點(diǎn) return 1; }這段代碼的講解難點(diǎn)在于兩行指針操作的順序。很多人初學(xué)時(shí)容易寫(xiě)成“先把L-next賦給s-next再讓L-next指向s”——其實(shí)順序是反的。這里有個(gè)口訣先接后面的線再斷前面的線。先讓新節(jié)點(diǎn)的next指向原第一個(gè)節(jié)點(diǎn)再讓頭結(jié)點(diǎn)的next指向新節(jié)點(diǎn)順序絕對(duì)不能反。如果先執(zhí)行L-next s原來(lái)的第一個(gè)節(jié)點(diǎn)就丟了整條鏈表從中斷開(kāi)。尾插法在鏈表尾部接上新節(jié)點(diǎn)// 尾插法在鏈表末尾插入新節(jié)點(diǎn) int TailInsert(LNode *L, int x) { LNode *s (LNode*)malloc(sizeof(LNode)); if (s NULL) { return 0; } s-data x; s-next NULL; // 找到當(dāng)前尾節(jié)點(diǎn) LNode *p L; while (p-next ! NULL) { p p-next; } p-next s; // 尾節(jié)點(diǎn)指向新節(jié)點(diǎn)新節(jié)點(diǎn)成為新的尾節(jié)點(diǎn) return 1; }尾插法的時(shí)間復(fù)雜度是O(n)因?yàn)槊看味家獜念^遍歷到尾。大量使用尾插法構(gòu)造鏈表時(shí)更高效的做法是設(shè)置一個(gè)尾指針。實(shí)際構(gòu)造鏈表時(shí)也常常讓用戶自定義建表方式這里為了操作展示保持簡(jiǎn)單沒(méi)有優(yōu)化成尾指針形式如果你要寫(xiě)一個(gè)高頻插入的模塊務(wù)必自己加尾巴指針。指定位置插入這算是插入操作的綜合應(yīng)用了// 指定位置插入在第i個(gè)位置插入新節(jié)點(diǎn)i從1開(kāi)始 int InsertAt(LNode *L, int i, int x) { LNode *p GetElem(L, i - 1); // 找到第i-1個(gè)節(jié)點(diǎn)它是新節(jié)點(diǎn)的前驅(qū) if (p NULL) { return 0; // 前驅(qū)不存在位置非法 } LNode *s (LNode*)malloc(sizeof(LNode)); if (s NULL) { return 0; } s-data x; s-next p-next; // 先接后面的線 p-next s; // 再斷前面的線 return 1; }這個(gè)操作把“按位查找”和“插入”組合起來(lái)了。注意細(xì)節(jié)調(diào)用GetElem找的是第i-1個(gè)節(jié)點(diǎn)。為什么不是第i個(gè)因?yàn)椴迦氲谋举|(zhì)是在第i-1個(gè)節(jié)點(diǎn)和第i個(gè)節(jié)點(diǎn)之間塞一個(gè)節(jié)點(diǎn)你手里需要有前驅(qū)節(jié)點(diǎn)的指針。這個(gè)“找前驅(qū)”的思維后邊的刪除操作也會(huì)用到屬于鏈表操作里最關(guān)鍵的思維模式之一。3.3 按位刪除與按值刪除先接后斷的完整應(yīng)用刪除操作的代碼量不大但它是考察指針操作理解程度的試金石。按位刪除// 按位刪除刪除第i個(gè)節(jié)點(diǎn)并用e返回其數(shù)據(jù) int DeleteAt(LNode *L, int i, int *e) { if (i 1) { return 0; } LNode *p GetElem(L, i - 1); // 找到被刪節(jié)點(diǎn)的前驅(qū) if (p NULL || p-next NULL) { return 0; // 前驅(qū)不存在或沒(méi)有第i個(gè)節(jié)點(diǎn) } LNode *q p-next; // q指向被刪除的節(jié)點(diǎn) *e q-data; // 帶回?cái)?shù)據(jù) p-next q-next; // 前驅(qū)直接跨過(guò)q連到q的下一個(gè)節(jié)點(diǎn) free(q); // 釋放被刪除節(jié)點(diǎn)的內(nèi)存 return 1; }這里同樣遵循“先接后斷”的原則但刪操作里是先斷前面的線p-next q-next再釋放節(jié)點(diǎn)。注意一個(gè)小細(xì)節(jié)調(diào)用GetElem找第i-1個(gè)節(jié)點(diǎn)找到后還要再確認(rèn)p-next ! NULL因?yàn)橛锌赡躨比鏈表長(zhǎng)度大1此時(shí)p不是NULL但p-next是NULL表示沒(méi)有第i個(gè)節(jié)點(diǎn)刪無(wú)可刪。按值刪除// 按值刪除刪除第一個(gè)值等于x的節(jié)點(diǎn) int DeleteByValue(LNode *L, int x) { LNode *p L; // p用于掃描前驅(qū) while (p-next ! NULL) { if (p-next-data x) { LNode *q p-next; p-next q-next; free(q); return 1; // 刪除成功 } p p-next; } return 0; // 沒(méi)有找到值為x的節(jié)點(diǎn) }按值刪除的掃描方式稍微有點(diǎn)特殊我讓p停在被刪節(jié)點(diǎn)的前驅(qū)位置判斷p-next-data是否等于x。這樣一旦找到不需要再額外找前驅(qū)直接操作p就能完成刪除。這個(gè)“讓指針停在當(dāng)前位置用p-next來(lái)操作”的寫(xiě)法在鏈表中非常實(shí)用需要熟到形成肌肉記憶。3.4 遍歷打印、求長(zhǎng)度、判空與修改基礎(chǔ)操作里的日常工具剩下幾個(gè)操作屬于“工具型操作”雖然代碼短但使用頻率極高我沒(méi)法不把它們收進(jìn)12個(gè)操作里。遍歷打印// 遍歷打印鏈表所有節(jié)點(diǎn)的值 void PrintList(LNode *L) { LNode *p L-next; while (p ! NULL) { printf(%d , p-data); p p-next; } printf(\n); }求鏈表長(zhǎng)度// 求鏈表長(zhǎng)度不含頭結(jié)點(diǎn) int Length(LNode *L) { int cnt 0; LNode *p L-next; while (p ! NULL) { cnt; p p-next; } return cnt; }判空與初始化// 初始化鏈表創(chuàng)建帶頭結(jié)點(diǎn)的空鏈表 LNode* InitList() { LNode *L (LNode*)malloc(sizeof(LNode)); if (L NULL) { return NULL; } L-next NULL; return L; } // 判斷鏈表是否為空 int IsEmpty(LNode *L) { return L-next NULL; }修改節(jié)點(diǎn)值// 修改第i個(gè)節(jié)點(diǎn)的值為新值 int ModifyAt(LNode *L, int i, int newVal) { LNode *p GetElem(L, i); if (p NULL) { return 0; } p-data newVal; return 1; }到這里12個(gè)操作全部覆蓋。你會(huì)發(fā)現(xiàn)這些代碼之間幾乎沒(méi)有“新東西”除了查找之外增刪改全是三兩行指針操作。這正是鏈表的特性邏輯簡(jiǎn)單但邊界極其容易出錯(cuò)。所以下面這個(gè)章節(jié)才是真正的考驗(yàn)場(chǎng)。4. 鏈表的進(jìn)階操作逆轉(zhuǎn)、排序、合并、去重、環(huán)檢測(cè)標(biāo)題雖然寫(xiě)的是“12個(gè)基礎(chǔ)操作”但只掌握12個(gè)基礎(chǔ)操作只能應(yīng)付教材上的練習(xí)題。面試和實(shí)際生產(chǎn)中鏈表的高頻考察點(diǎn)幾乎全部落在進(jìn)階操作上。這些操作也正好是檢驗(yàn)?zāi)闶欠裾嬲斫饬恕爸羔樦赶蜃兓钡淖詈迷嚱鹗?.1 鏈表逆轉(zhuǎn)迭代三指針?lè)ㄦ湵淼哪孓D(zhuǎn)說(shuō)白了就是把每個(gè)節(jié)點(diǎn)的next指向前一個(gè)節(jié)點(diǎn)。難點(diǎn)在于當(dāng)你把一個(gè)節(jié)點(diǎn)的next改掉之后原來(lái)的下一個(gè)節(jié)點(diǎn)就找不到了所以需要一個(gè)指針提前保存它。// 單鏈表原地逆轉(zhuǎn)帶頭結(jié)點(diǎn) void ReverseList(LNode *L) { LNode *prev NULL; // 前驅(qū)初始為空逆轉(zhuǎn)后原來(lái)的頭節(jié)點(diǎn)變尾指向NULL LNode *cur L-next; // 從第一個(gè)數(shù)據(jù)節(jié)點(diǎn)開(kāi)始 while (cur ! NULL) { LNode *next cur-next; // 先保存下一個(gè)節(jié)點(diǎn)防止丟失 cur-next prev; // 翻轉(zhuǎn)指針?lè)较?prev cur; // 前驅(qū)前移 cur next; // 當(dāng)前節(jié)點(diǎn)前移 } L-next prev; // 最后一個(gè)prev就是逆轉(zhuǎn)后的第一個(gè)節(jié)點(diǎn) }這個(gè)三指針?lè)ㄊ擎湵砟孓D(zhuǎn)的標(biāo)準(zhǔn)解法記憶時(shí)可以想象成“三個(gè)手指頭交替往前挪”。還有遞歸解法但在鏈表長(zhǎng)度較大時(shí)遞歸有棧溢出風(fēng)險(xiǎn)實(shí)戰(zhàn)中我基本都用三指針?lè)ā?.2 兩個(gè)有序鏈表的合并歸并思想從這入門(mén)合并兩個(gè)升序鏈表輸出還是升序這是歸并排序在鏈表上的一個(gè)前置操作。實(shí)現(xiàn)思路很簡(jiǎn)單兩個(gè)指針?lè)謩e指向兩個(gè)鏈表頭部誰(shuí)小誰(shuí)先接入新鏈表然后對(duì)應(yīng)指針后移。// 合并兩個(gè)升序鏈表返回新鏈表的頭指針不破壞原鏈表 LNode* MergeSortedList(LNode *L1, LNode *L2) { LNode *dummy (LNode*)malloc(sizeof(LNode)); // 新鏈表帶頭結(jié)點(diǎn) dummy-next NULL; LNode *tail dummy; // 尾指針接新節(jié)點(diǎn)用 LNode *p L1-next; LNode *q L2-next; while (p ! NULL q ! NULL) { if (p-data q-data) { tail-next p; p p-next; } else { tail-next q; q q-next; } tail tail-next; } // 把剩余部分整體接上 tail-next (p ! NULL) ? p : q; return dummy; }這里為什么允許直接接上剩余部分因?yàn)楹喜⒉僮髦皇侵匦陆M織節(jié)點(diǎn)之間的next關(guān)系每個(gè)節(jié)點(diǎn)本身的內(nèi)存沒(méi)變。剩余的那個(gè)鏈表片段天然有序直接掛上去即可。這個(gè)“整體接入”的思路比逐節(jié)點(diǎn)拷貝高效得多。4.3 鏈表排序冒泡與歸并的選擇如果想對(duì)一個(gè)無(wú)序鏈表排序最省事的是冒泡排序。雖然時(shí)間復(fù)雜度是O(n^2)但勝在代碼簡(jiǎn)單、空間復(fù)雜度為O(1)適合鏈表這種不支持隨機(jī)訪問(wèn)的結(jié)構(gòu)。// 鏈表冒泡排序只交換數(shù)據(jù)域不修改指針關(guān)系 void BubbleSortList(LNode *L) { if (L NULL || L-next NULL) { return; } int swapped; LNode *p; LNode *end NULL; // 指向已排序部分的尾部標(biāo)記 do { swapped 0; p L-next; while (p-next ! end) { if (p-data p-next-data) { // 交換兩個(gè)節(jié)點(diǎn)的數(shù)據(jù)域 int tmp p-data; p-data p-next-data; p-next-data tmp; swapped 1; } p p-next; } end p; // 上一層循環(huán)結(jié)束時(shí)p指向無(wú)序區(qū)最后一個(gè)節(jié)點(diǎn)下一輪無(wú)序區(qū)縮短 } while (swapped); }注意我選擇的是“只交換數(shù)據(jù)不改指針”的方案。為什么不移動(dòng)節(jié)點(diǎn)本身因?yàn)橐苿?dòng)節(jié)點(diǎn)需要維護(hù)前驅(qū)關(guān)系涉及大量細(xì)節(jié)而數(shù)據(jù)交換在單鏈表里實(shí)現(xiàn)極其簡(jiǎn)單。如果數(shù)據(jù)域體積大比如每個(gè)節(jié)點(diǎn)存一個(gè)幾百字節(jié)的結(jié)構(gòu)體那交換數(shù)據(jù)的代價(jià)就很高不如改成指針移動(dòng)的排序。實(shí)際項(xiàng)目中根據(jù)場(chǎng)景取舍。追求更優(yōu)性能的話鏈表歸并排序是更好的選擇它可以做到O(n log n)且空間復(fù)雜度為O(log n)遞歸棧。這里不展開(kāi)完整的歸并排序代碼上面的MergeSortedList已經(jīng)是它的核心組件。4.4 無(wú)序鏈表去重哈希表與雙重循環(huán)無(wú)序鏈表去重最直觀的做法是雙重循環(huán)外層遍歷每一個(gè)節(jié)點(diǎn)內(nèi)層掃描它后面的所有節(jié)點(diǎn)刪除重復(fù)值。// 無(wú)序鏈表去重雙重循環(huán)版空間復(fù)雜度O(1) void RemoveDuplicate(LNode *L) { LNode *outer L-next; while (outer ! NULL) { LNode *prev outer; // prev是內(nèi)層掃描時(shí)“外層節(jié)點(diǎn)之后”部分的前驅(qū) LNode *inner outer-next; while (inner ! NULL) { if (inner-data outer-data) { // 刪除inner節(jié)點(diǎn) prev-next inner-next; free(inner); inner prev-next; // 注意刪除后inner要重新接到prev的后面 } else { prev inner; inner inner-next; } } outer outer-next; } }這個(gè)代碼的陷阱在于刪除節(jié)點(diǎn)后的指針移動(dòng)。刪除inner后原來(lái)的inner已經(jīng)被釋放不能再訪問(wèn)inner-next所以要把inner重新賦值為prev-next。這種“刪完當(dāng)前節(jié)點(diǎn)后指針怎么挪”的問(wèn)題在鏈表刪除類題目里反復(fù)出現(xiàn)值得單獨(dú)標(biāo)注。如果允許額外空間用一個(gè)哈希表記錄出現(xiàn)過(guò)的值可以讓時(shí)間復(fù)雜度從O(n^2)降到O(n)。工程上數(shù)據(jù)量大時(shí)優(yōu)先考慮哈希表方案但考場(chǎng)上如果明確限制空間雙重循環(huán)才是標(biāo)準(zhǔn)答案。4.5 快慢指針檢測(cè)環(huán)為什么慢指針一定能追上檢測(cè)鏈表是否有環(huán)經(jīng)典解法是快慢指針。快指針一次走兩步慢指針一次走一步。如果鏈表有環(huán)快指針一定會(huì)最終追上慢指針如果沒(méi)有環(huán)快指針先走到尾部NULL。// 檢測(cè)鏈表是否有環(huán)有環(huán)返回1無(wú)環(huán)返回0 int HasCycle(LNode *L) { LNode *fast L; LNode *slow L; while (fast ! NULL fast-next ! NULL) { fast fast-next-next; // 快指針走兩步 slow slow-next; // 慢指針走一步 if (fast slow) { return 1; // 相遇說(shuō)明有環(huán) } } return 0; // 快指針到達(dá)尾部說(shuō)明無(wú)環(huán) }為什么快指針一定能追上慢指針直觀解釋是進(jìn)入環(huán)之后快指針在和慢指針的速度差是每單位時(shí)間一個(gè)節(jié)點(diǎn)而環(huán)的長(zhǎng)度是有限的快指針相對(duì)慢指針每次縮短1個(gè)節(jié)點(diǎn)距離最多走一圈多就能追上。這不是什么玄學(xué)而是一個(gè)簡(jiǎn)單的追及問(wèn)題。如果進(jìn)一步要求找出環(huán)的入口節(jié)點(diǎn)可以這樣操作快慢相遇后把快指針重新指向頭結(jié)點(diǎn)然后把兩個(gè)指針都改成一次走一步再次相遇的位置就是環(huán)的入口。這個(gè)證明涉及一點(diǎn)數(shù)學(xué)推導(dǎo)感興趣的話可以自己證明一下結(jié)論非常優(yōu)雅。4.6 求鏈表的中間節(jié)點(diǎn)奇數(shù)偶數(shù)的統(tǒng)一解法求中間節(jié)點(diǎn)樸素做法是先遍歷一遍求長(zhǎng)度再走一半??炻羔樋梢砸惶私鉀Q快指針到尾部時(shí)慢指針恰好在中點(diǎn)。// 求鏈表的中間節(jié)點(diǎn)偶數(shù)個(gè)節(jié)點(diǎn)時(shí)返回后一個(gè)中間節(jié)點(diǎn) LNode* FindMiddle(LNode *L) { LNode *fast L-next; LNode *slow L-next; while (fast ! NULL fast-next ! NULL) { fast fast-next-next; slow slow-next; } return slow; }這里有一個(gè)細(xì)節(jié)如果鏈表有偶數(shù)個(gè)節(jié)點(diǎn)例如4個(gè)快指針走兩步到達(dá)第3個(gè)節(jié)點(diǎn)慢指針在第2個(gè)再走兩步快指針變成NULL慢指針在第3個(gè)。也就是說(shuō)返回的是“后一個(gè)中間節(jié)點(diǎn)”。如果你需要偶數(shù)時(shí)返回前一個(gè)只需要把循環(huán)條件改成fast-next ! NULL fast-next-next ! NULL。這種細(xì)微的語(yǔ)義差異考試中經(jīng)常被拿來(lái)考自己實(shí)現(xiàn)時(shí)也要根據(jù)需求明確。5. 鏈表調(diào)試的真實(shí)踩坑記錄代碼能跑通是第一步能調(diào)試才是真本事。鏈表這種結(jié)構(gòu)一旦出問(wèn)題經(jīng)常是段錯(cuò)誤或者死循環(huán)肉眼很難看出來(lái)。這一節(jié)我把我自己實(shí)際寫(xiě)鏈表代碼時(shí)踩過(guò)的坑整理出來(lái)希望能幫你少走彎路。5.1 空指針與野指針段錯(cuò)誤的頭號(hào)元兇我早期寫(xiě)的鏈表代碼里段錯(cuò)誤絕大多數(shù)源于空指針或野指針訪問(wèn)。典型場(chǎng)景是查找函數(shù)返回NULL但調(diào)用方?jīng)]有判斷就直接訪問(wèn)p-data。// 錯(cuò)誤示范沒(méi)有判斷GetElem返回值 LNode *p GetElem(L, 5); p-data 100; // 如果第5個(gè)節(jié)點(diǎn)不存在這里直接段錯(cuò)誤預(yù)防措施是約定公共接口必須檢查返回值但這個(gè)約定光寫(xiě)在文檔里沒(méi)用要在代碼層面強(qiáng)約束。我的習(xí)慣是任何從函數(shù)返回的指針在解引用之前先問(wèn)一句“它為NULL時(shí)應(yīng)該怎么辦”。不能篤定“這個(gè)函數(shù)一定能返回非NULL”鏈表的節(jié)點(diǎn)本來(lái)就會(huì)被合法地刪空。5.2 指針移動(dòng)順序錯(cuò)了先接后斷的教訓(xùn)插入操作中如果先執(zhí)行了“前驅(qū)指向新節(jié)點(diǎn)”的操作原鏈表就斷了。這個(gè)過(guò)程我初學(xué)時(shí)的記憶方法就是一句口訣“先接后面的線再斷前面的線?!彼胁迦?、刪除、逆轉(zhuǎn)操作本質(zhì)上都在調(diào)整線頭的連接順序順序一錯(cuò)鏈表結(jié)構(gòu)就會(huì)被破壞。舉個(gè)具體的例子第i個(gè)位置插入時(shí)如果寫(xiě)反// 錯(cuò)誤示范順序反了 p-next s; // p原來(lái)指向的后繼節(jié)點(diǎn)被丟棄 s-next p-next; // 此時(shí)p-next已經(jīng)是s了s指向自己形成環(huán)這樣不僅丟掉了原鏈表的一部分還會(huì)讓新節(jié)點(diǎn)指向自己產(chǎn)生一個(gè)環(huán)。這種錯(cuò)誤的后果比段錯(cuò)誤還隱蔽因?yàn)槟憧赡懿粫?huì)立刻崩潰而是在遍歷時(shí)陷入死循環(huán)。5.3 邊界條件的檢測(cè)套路鏈表的邊界條件總結(jié)起來(lái)就三種空鏈表頭結(jié)點(diǎn)下一個(gè)節(jié)點(diǎn)就是NULL。只含一個(gè)節(jié)點(diǎn)第一個(gè)節(jié)點(diǎn)操作完直接變空。操作位置在頭尾頭部插入刪除和尾部插入刪除是否還能正常走通。我調(diào)試鏈表代碼時(shí)有一個(gè)固定儀式找一個(gè)最簡(jiǎn)單的數(shù)據(jù)比如3個(gè)節(jié)點(diǎn)的鏈表手動(dòng)把插入、刪除、查找、逆轉(zhuǎn)全部走一遍。只要3個(gè)節(jié)點(diǎn)的場(chǎng)景全部正確90%的邊界問(wèn)題都能暴露出來(lái)。不要一上來(lái)就測(cè)幾千個(gè)節(jié)點(diǎn)的大數(shù)據(jù)調(diào)試成本太高問(wèn)題也不容易定位。5.4 調(diào)試鏈表的三板斧第一板斧是打印法。在每個(gè)關(guān)鍵步驟后打印鏈表內(nèi)容和節(jié)點(diǎn)地址觀察指針關(guān)系是否符合預(yù)期。具體可以打印出每個(gè)節(jié)點(diǎn)的值和指向下一個(gè)節(jié)點(diǎn)的地址。第二板斧是畫(huà)圖法。拿一張紙把鏈表節(jié)點(diǎn)畫(huà)出來(lái)模擬指針的移動(dòng)和修改。這個(gè)辦法看起來(lái)笨但對(duì)理解“先接后斷”的本質(zhì)特別有效。說(shuō)句實(shí)話我現(xiàn)在遇到復(fù)雜的鏈表問(wèn)題還是會(huì)用紙筆畫(huà)一畫(huà)。第三板斧是畫(huà)圖加斷言。C語(yǔ)言里可以加assert(p ! NULL)等斷言在調(diào)試版里強(qiáng)制檢查指針狀態(tài)。不過(guò)斷言只在調(diào)試期有效發(fā)布版最好關(guān)掉量產(chǎn)代碼里還是要靠手動(dòng)檢查返回值。最后分享一個(gè)我自己總結(jié)的調(diào)試思想寫(xiě)鏈表代碼不要圖快要一個(gè)函數(shù)一個(gè)函數(shù)地驗(yàn)證每寫(xiě)一個(gè)操作就用最標(biāo)準(zhǔn)的數(shù)據(jù)測(cè)一遍。很多初學(xué)者喜歡照著網(wǎng)上的代碼一次性抄完十幾個(gè)函數(shù)然后一起編譯一起跑結(jié)果報(bào)錯(cuò)之后完全不知道從哪里查。鏈表這種結(jié)構(gòu)它的調(diào)試必須“一次只動(dòng)一個(gè)地方”把每個(gè)操作的可靠性攢起來(lái)最后組合使用時(shí)才不會(huì)翻車(chē)。希望這篇拆解能幫你把數(shù)據(jù)結(jié)構(gòu)三要素落到實(shí)處把鏈表的每一個(gè)操作都變成自然而然的選擇而不是死記硬背的代碼片段。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲成?V人片在线观看福利| 欧美情色贴图| 玖玖爱一区在线| 人人看欧美性爱| 亚洲欧美首页| 国产精品第一页国产大屁股视频免费区i| 五月激情在线| 凹凸视频特色日本特黄| 日韩欧美aⅴ综合网站发布| 色约约一区=区三区| 国产地址二三| 伊人国产视频| 天天操女人| 自慰白浆在线观看| 福利社区午夜一区二区| 一个人免费HD91视频| 91美女视频| 99999亚洲另类| 一区二区三区成人| 99re热| 青青11操操操操操操操操| 网页导航五月天免费一二三区| 国产午夜在线观看视频| 黄色大片免费在线| 高清国产无码av| 91综合网在线| 午夜一区二区三区国产| 飘花国产午夜精品不卡| 草草草视频在线免费看| 亚洲中文日韩精品| 69综合网| 91美女视频在线| 97玖玖超碰| 精品久一区免费| 久久一二三级一一一| 久jiu久神马影院| 国产不卡精品91| 久久国产精品一级二级三级| 天天色综合图片| www超碰| 亚欧高清v| 五月婷网站| 黄色片,com| 亚洲国产av中文字幕久久| 国产日韩精品suv| 久久av无码| 草草草视频在线免费看| 日韩女模中文造逼| 久久亚洲不卡一区二区三区| 激情文学 亚洲图片| 老女人91| 九九九一二三| 国产精品福利资源在线尤物| 欧美成人A√在线一区二区| 国产JDAV无码视频在线观看| 日韩精品国产精品五码一区二区| 大稥蕉免费视频这里只有精品| 加勒比大香蕉视频在线| 亚洲精品久久久久久久久豆丁网| 欧美色图小说综合| 9久久久久| 精品日韩人妻视频| 1024人妻熟女一区二区三区| 中文字幕黄色片| 97操97色| 精品国产AV一区天美传媒| 干超碰碰熟女| 99热只有这里有精品| 在线 制服丝袜中出 人妻| 又大又黄国产| 亚洲污污网站| 欧美亚洲丝袜人妻制服中文99| 91亚洲欧美| 五十路三级片| AV一二区| 97亚洲自在精品在线观看| 极品销魂美女一区二区| 日本在线不卡v二区| 国内91熟女人妻丝袜天天精品视频在线 | 欧美色亚洲色| 99久国产精品午夜性色福利| 日本午夜福利影院| 成人五月香网在线| 精品人妻一区二区蜜桃视频| 国产强奸无码乱伦| 国产精品久久久久久久久AV大片 | 神马久久免费电影观看| 伊人久久综合影院精品久久久| 免费黄色A片| 九九无码久久精品视频| 青草地一本线一区二区三区| 黄色性爱网网| 老女人碰碰在线碰碰视频| 啊啊啊在线观看| 国产热RE99久久6国产精品首 | 亚洲国产一区二区入口| 夜夜嗨一区二区三区三州加勒比 | 久久天天摸| 啊啊啊啊好疼| 婷婷色导航| 久久国模av| 91亚洲情色| 人人射人人操人人摸| 亚洲一二三精品久久网 | 情色AV电影| 97少妇人妻中文字幕久久| 岛国激情视频在线观看| yiren97| 97超碰9| 性色av婷婷久久一区二区点复制| 加勒比av网| 欧美极品性爱天天射| 超碰 另类 欧美| 免费国产视频| 欧美九9 9 9| 欧美女同在线| 日韩人妻一区二区精品| 精久久久| 99精品久久久久久久婷婷蜜桃| 综合av影片| 激情 欧美 亚洲 小说| yirendaxiangjiashipin| 啊啊啊啊免费视频| 99无码视频| 嗯嗯不要 视频| 99精品久久久久久久婷婷| 少妇人妻无码| 无码日韩人妻av一| 青青青草伊人精品| 丁香五月天激情| 91丝袜人妻| 人人操av| 最新日本中文字幕| a片亚洲一本通视频| 国产无马视频| 狠狠超| 成年男人的天堂| 亚洲一区二区在线观看91| 国产人伦精品一区二区三区| 日本十八禁免费看污网站| 日韩av色图综合| 99热99在线播放激情| 99热这里只有是精品10| 亚洲aV性爱| 96精品久久| 96AV久久久| av在线观看不卡网站| 天天久久久久久| 亚州宗合另类| 国产精品自在线发布| 91老妇女| 91欧美综合在线| 职场同事知名国产国产精品久久欧美日韩 | 亚洲五区熟女| 黄片www.| 欧美性生活免费网| 亚洲伊人成综合成人网| 亚洲日韩黑丝| 1024亚洲中文字幕久在线看片你懂的 | 不卡九肏| 91爆操视频| 外国免费性情大片| 91 丝袜在线观看| 天天添天天干电影| 亚洲欧美激情在线视频| 成人26uuu| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 亚洲成人福利电影免费| 日本不卡五区| 久久亚洲一区女同性恋中文字幕 | 欧美加勒比| 美女裸体麻豆天美蜜桃91| 熟女被操视频网址| 天天插夜夜操| 亚洲国产精品有声| 亚洲中文字幕精品一区| 欧美激情 一区| 成人老鸭窝人人在线视频| 日本天天色| 亚洲第一黄色av网站| 国产女人视频三四五区| 91精品婷婷国产综合久久| 天天干一区二区| av天堂5| 情趣丝袜无码操逼视频| 日本精品999| 天天干夜夜| 亚洲男人的天堂AV| 欧美久久久| 青青草成人视频在线观看二区| 大香蕉伊人网WWWn0n| 婷婷丁香久久| 国产欧美一区激情交| 色就色综合| 香蕉国产精品麻豆亚洲欧美日韩| 日本久久女同性恋视频| 热99这里有精品综合久久| 欧美日韩操逼动图| 岛国福利在线精品播放| 99热| 亚洲一区在线观看欧洲 | 亚洲综合另类欧美久久久| 人妻天天夜夜爽一区二区| 国产伦精品一区二区三区在线观| 亚洲一区二区精品福利| 久操视频资源站公开| 黄视频免费| 欧美不卡在线一区二区| 人妻 中文 日韩| 先锋色眉乱伦资源| 国产福利精品最新在线| 我要看免费韩日黄片| 久久亚洲AV无码专区国产精品| 国产亚洲中文不卡二区| 久久久无码av精| 92人人操人人| 婷婷综合网| 激情丁香五月婷婷| 青青草原综合久久大伊人精品| 午夜福利久久久噜久噜久久综合 | 欧美黄页| 成人一级性爱| www.夜夜操| 熟妇最新先锋一二三区| 久久久精品一区二区| 色五月激情AV在线| 亚洲日韩狠狠撸视频| 精品久久久一本一道| 中文字幕激情小说| 欧美日韩大香蕉| 天天操夜夜操狠很操| caoni国产亚洲av| 国产欧美日韩在线不卡第一页| 婷婷五月丁香五月| 成人片视频| 99精品无码| 91丨人妻丨国产丨丝袜| 日韩亚洲中文有码视频| 盗摄 精品 另类 一区| 四虎视频在线观看| 欧美男人的天堂| 成人羞羞视频国产| 国产 无码 一区二区| 大香蕉婷婷| 国精品一区二区三| 亚洲性综合11| 国产精品无码AV网站| 亚洲人妻一区二区三区| 欧美亚洲激情一二三| 好爽视频在线观看视频| 亚洲乱伦图片视频| 熟女丰满人妻一区| 久久超碰国产一区二区三区| 免费人成在线观看网站品爱网| 五月天大香蕉| 国产精品动态一区二区三区四四| 欧美精品成人一区二区在线观看| 五月丁香网站| 加勒比av官网在线| 黄色大片视频在线免费看| 日韩av影片在线观看| 九九九九九九九九九九九免费国产| 超碰久久精品| 日韩黄片影院| 久久国色天香香蕉| 蜜桃传媒视频第一区入口在线看| 在线观看无码三级少妇| 久久嫩草国产成人一区| 日欧操屄| 色av中文字| 青青操视频在线| 岛国大片国产| 91中文精品日韩欧美在线 | 五月丁香拍拍激情综合三级| 男人的天堂2018.| 国产剧情在线| 99精品在线播放| 国产乱码精品久久久久久 | 亚洲AV无码久久精品蜜桃小说| 农村妇女精品一二区| 97国产成人精品免费视频| 狠狠色一区二区中文字幕| 国产精品成久久久久午夜午夜| 久操操| 一二三四区电影| 2021久久国产综合精品青草| 小骚逼被操的爽不爽| 欧美极品美女aaaaaa级黄片| 九九精品美女高溯喷水| 国产精品分类在线观看| 精品网站9999| 夜夜草天天| 欧美一二在线| 婷婷午夜成人色中色| 亚洲第一二区另类图| 亚洲精品免费中文字幕| 天堂精品小草| 人人操人人大香蕉| 骚鸭AV| 亚洲综合五月天| 亚洲高潮影院| 啊啊啊啊啊操我视频| 屁股久久久久久久| 中文字幕97色| 99性爱在线观看| 国产精品69久久久久孕妇欧美| 中文字幕日韩人妻视频一区二区三区 | 国产精品自在自拍视频| 新精精品久久精品| 人人看人人摸人人色| 久久久少妇诱惑精品视频| 99亚洲天堂| 野狼福利社区| 91啦人妻| 久草视频制服诱惑| 欧美日韩插逼视频| 黑丝内射一区二区三区| 内射小黄片| 亚洲国产蜜臀系列在线观看| 男人的天堂啪啪| 久久97| 丁香婷婷激情五月天无毒不卡| www.久久制服糖| 校园春色美腿丝袜 | 神马九九九| 夜夜草网站| 久久六六| 91强在线播放| 亚洲另类久操网| 免费人成在线观看网站品爱网| 久9爱经典视频| 中文字幕一区av| 91被操| 亚洲人精品午夜不卡| 亚洲日韩一区电影| 综合欧美激情网| 精品玖九九久| 伊人991| 人妻久久久久久| 日韩偷拍一区二区三区| 99AV| 色偷综合| 五月天色图| 日韩人妻一区二区精品| 日韩视频精品在线观看| 蜜臀99久久国产| 动漫av中文| 怡红院视频在线| 久久香蕉综合一本到3atv| 国产传媒日韩欧美| 精产品久久| 亚洲精品一区二区免费在线观看| 欧美精品另类人妖xxxx| 五月天婷婷综合| 国产黄色 A 片免费看| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 五月天人妻综合| AV一二区| 99色热| 黄色AAAAAAAAAAA大片| 97在线看| 欧州91高潮| 后入综合久久| 97综合久第一页| 麻豆天美传媒在线视频天堂| 亚洲日韩AV视色| 无套内射性感少妇视频| 日本人人操人人操| 日韩乱中文| 午夜亚洲国产理论秋霞| 欧美成人性爱视频在线播放| 亚洲一区二区三区婷婷| 91高潮| 91久热| 91高清日| 久久蜜桃一区二区| 91狠狠综合久久| 国产中午字一暮区| 色原狠狠天天天| 智利AV在线网| 日韩熟女视频二区| 色偷偷超碰亚洲| 物业黑人 AV一区| 亚洲天堂电影网| 亚洲天堂日本| 四虎免费视频| 色区97| 91 综合网| 综合久久2017| 色色毛片| 超97在线精品视频| 日韩性爱再线视频| 丁香婷婷大香蕉| 亚洲少妇色| 亚洲有薄码区日本系列中文字幕| 麻豆久久久久久久久丝袜| 毛片视频白嫩| 色欧洲97| 蜜臀AV一区二区三区| 91色宗合| 久久成人国产精品| 97摸视频| 国产av青草| 久久久久ab| 国产人人干| 大香蕉人妻久久| 91丝袜在线观看| 在线观看免费视频国产| 五月婷婷六月丁香| 久久綜合很很很| 国产精品69久久久久久久 | 青草视频在线看看看看看看看看看| 天堂九九九九九九九九九| 一本正道久久熟女| 色综合超碰超| 国产精品乱码久久| 人人操人人色人人摸| 青青草丝袜在线视频| 国产伦精品一区二区三区在线观| 超碰79人人乐| 日本久久999| 另类欧美色| 久久久国产av美女私房| 毛片电影一区二区三区| 久久久久久久久久黄色网| 大香蕉日亚洲日本亚大| 成人性爱免费播放| 日本亚洲熟女视频| 97视频在| 丝袜综合网| 日韩国产在线观看av| 亚洲少妇色| 国产外初女出血视频| 另类图片天天影视| 曰韩无码777| 欧美国产有色电影| 超碰97精品| 黄色高清无码无码破解免费暗网| 色婷婷婷五月天激情四射| 91青青| 国产精品久久久无码AV网站| 欧美三级一级| 久久二| 日本亚洲熟女视频| 久啪| 九九精品无码专区免费| 国产欧美美女免费观看视频| 大香蕉日韩| 欧美系列在线一区二区| 1024手机看片欧美日韩| 麻豆视频国产一区二区| 久久伊人在线五区| 精品视频一区二区| 久久久999日本大片| 亚洲在线综合| 欧美婷婷五月天| 九九九草| 操高情无码| 搞中出视频在线观看| 91老熟妇| 亚洲天天艹| 日天天九九天堂666| 免费簧片在线观看| 激情人妻另类| 国产成人免费观看在线视频| 偷拍片久久| 欧美色视频在线| 97超碰资源网| 97人人操人人摸| 日韩视频小说在线观看 | 日韩在线76| 日本色日夜干| 久视频在线观看| 69视频入口| 色婷婷aV一区二区三区麻豆综合| 久久性爱视频免费看| av在线人气 | 97一本大道亚洲一区| 久久亚洲欧美中文字幕国语| 97这里只精品| 成人福利视频网| 91天美免费| 男人的天堂不卡一区二区 | 中文字幕 国产区| 国产精品丝袜在线| julia在线观看久久| 激情黄色片在线观看| 天天看高清麻豆| 国产真实野战在线视频| 人妻少妇精品久久久久久| 欧美后进式| 91被操| 久久久免费懂色| 成人av免费观看| 91色狼| 丰满搜索结果 -第18页- 久久高清无码| 强奸乱伦 亚洲一区| 亚洲综合一| 九九色色| 日日操丁香五月天| 日韩有码专区| 青青欧美| 久久久精品国产亚洲伊人| 婷婷色色五月天福利| 人人操人人射人人干| 草草影院在线视频| 欧美黑人精品在线播放| 91狠狠综合久久| 青青草啪啪网| 99re视频在线观看这里只有精品| 两女互慰AV高潮喷水在线观看| 美国三级日本三级久久99| 97人肏| 免费强奸av| 成人精品在线免费视频| 亚洲综合在线91| 激情欧美日韩女同久久| 青青草日韩无码| 国模不卡| 一级黄色性爱裸体视频| 国产国产亚洲一二三久久| 国产91精品久久久久久久网曝门| 久碰视频| 天天日B夜夜干B时时操B| 久久91| 91国产丝袜白虎| 97色色,97综合| 国产女人高潮视频| 人妻熟女av国产网站| 无码直播久久久| 欧美色院| 高清孕妇孕交 交| 人妻素股| 99只有精品| 精品无人区麻豆乱码久久久| A V少妇特黄三级| 欧美日韩操逼嗦吊| 国产高清MV操逼视频| 日韩黄色片子| 人人模人人看| 99久久国产精品免费高潮| 美女高潮国产高清| 久久精品无码专区| 91女日逼| 91老司机视频| 日韩大香蕉AV影片| 天天干夜夜鈤| 超碰97男女| 大香蕉人妻久久| 老鸭窝在线视频播放| www. 男人天堂成人在线| 欧美激情超碰777| 久久久久国产亚洲一区欧美色图日韩| 91国产精品在线看| 欧美精品另类人妖xxxx| 青青草九九九九九| 国产性感骚丝袜在线| 久久熟女人| 色999人与兽| 青青草自拍视频在线播放| 亚洲不卡AV在线| 欧洲无码一区二区| 91丝袜美女| 久艹伊人精品综合在线| 日本一片一区| 亚州高清色综合| 天天插天天操天天摸天天射天天看| 久久爽爽精品| 校园春色欧美| 97在线视频免费看| 精品综合久久久久久五月天| 国内亚洲高清无码| 亚洲天堂人妻熟妇视频| 亚洲黄网在哪免费看| 九九色影院| 亚洲色图久久成人| 99在线观看无大码| 本道在线| 欧美色女人| 精品毛片av一区二区| 伊人黄色视频免费观看| 素人播放一区| 热久日综合| 精品十八在线观看| 明星性猛交ⅹxxx乱大交| 亚洲一区二区三区中文字幕| 麻豆国产免费影片| 熟妇视频一区二区三区在线观看| 中文字幕日韩人妻视频一区二区三区交换夫妻| 日本熟妇色熟妇在线视频播放| 国内精品久9| 17c嫩草51久久91嫩草| 中文人妻av高清一区| 久草福利在线资源站| 男人的天堂在线有码| 校园春色亚洲无码| 久久精品店| 国产Aα| 色噜噜综合在线| 一区二区三区色综合| 欧美性性性| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 九九九九九九精品| 日韩性爱一级片| 国产精品熟女丝袜一区二区| 少妇高潮99p| 国产外初女出血视频| 又粗又长又大国产不卡| 青娱乐久久艹| 诱惑人妻欧美一区在线播放| 日本欧美不卡| 国产高清MV操逼视频| 亚洲精品久久久久久久久豆丁网| 欧美在线干| 日韩黄片影院| 97视频网站在线观看| 男人天堂最新手机版在线青青草| 香伊人在线| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 综合网91| 91丨九色丨熟女高潮| 精品96久久| 日韩精品在线视频,日韩精品……| 午夜一区二区三区国产| AV一二区| 欧美精品宗合| 91无码中出人妻视频| 破处bbq| 插穴性爱视频在线观看| 老师充足的奶水小说| 蜜臀久久99精品久久久久久| 色婷久久| 超碰人人干天天射| 女人高潮抽搐喷水视频网站| 9999九九九久久久| 中国一级操逼视频| 中文字幕78| 久久久久久久久久久免费精品| 日韩女优在线| 亚洲麻豆av一区二区| 欧州色图区| 香蕉视频精品亚洲一区二区三区在线播| 亚洲欧美日韩精品久久久一区二区| 97超级欧美| 巨爆乳一区二区爆乳区| 欧美日韩大陆黑人少妇99| 桃花色综合影院| 亚洲色图a| 最新av中文字幕高清| 色狠人在线99| 国产高清免费不卡av| 2017大香蕉国产精品久久| 午夜乱轮操逼视频免费看| 天天看特黄的免费网站 | 天天操天天谢| 乱色视频中文字幕| 人人妻人人爽| 欧美制服另类丝袜| 日韩有码 一区二区三区| 91电影色诱| 日本成人A片免费看| 欧美色图人妻| 久久久久9| 国产精品日日摸夜夜添骚逼| 欧美亚男人的天堂| 又粗又长又爽在线观看| 中文字幕精品专区搜索结果91| 自拍鲍鱼一区在线高清观看免费| 东京热,男人的天堂| 久久久999日本大片| 精品亚洲一区在线观看| 亚洲激情天堂网| 亚洲性爱无码乱伦av| 亚洲女人91| 欧美色图私拍91| 国产乱码精品一区二区三区四川| 99re黄 | 久久国产在线一区二区| 国产乱子伦一区二区三区免看| 999岛国大片| 国产精品久久| 精品人妻一二三四区视频| 久久九九网| 国产精品一二三区18| 亚州高清av| 一二三四日本视频高清| 在线欧美69V免费观看视频| 亚州色图欧美色图| 欧美天天谢综合网| 国产激情片在线观看| 久操电影| 91天天综合在线观看| 国产suv精品一区二区四区999| 手机在线中文字幕国产| 久操免费观看| 青青草中日韩在线| 久久久久久久 九九九九九九九 | 91蜜桃传媒精品久久久一区二区| 日韩精品人妻中文字幕有码午| 亚洲乱码国产乱码精网站| 日本色日夜干| 亚洲人妻久久久| 亚洲狼狼干综合1| 色99视频| 性爱乱伦一区| 亚川综合视频| 亚洲欧美综合| 易易A毛视频| 午夜精品人妻二区三区| 9热9热综合网| 在线观看一卡二卡| 国产精选三级在线观看| 高清国产成人无码| 无码精品久久久久久亚洲| 欧美色交| 人人爽夜夜玩视频| 男人的天堂日本东京热| 老熟女熟妇| AV色天香在线| 熟妇熟女视频一区二区三区| 思思热免费视频观看| 6080YYY午夜理论片在线观看| 日日爱99| 精品久| 亚洲国产天堂| 欧美性爱超碰97| 秘书高跟黑色丝袜国产91在线| 欧美激情久久久久| 国产乱码精品久久久久久| 操人妻逼91| 亚洲乱色视频一区、二区在线| 五月婷婷综合网| 爱射综合| 欧美99| 国产av尤物| 色综合五月天| 国产在线76页| 91欧美高清| 婷婷香蕉欧美在线一区二区三区| 日韩啪啪啪啪啪| 亚洲天堂,男人| 蜜臀久久99精品久久综合| 亚洲色天堂日韩中| 亚洲中文制服诱惑| 亚洲妇色| 亚洲色图 图片| 亚洲drav色图| 91久热| 亚洲中文字幕熟女少妇一区二区| 国产精品伦理| 亚州男人天堂| 日韩免费av片高清无码| 国产精品久久久久久久AV大片| 国产精品爱欲| 熟女人妇一区二区三区| 探花激情视频| 日本人体九九九九九九| 欧美18禁91| 色男人色天堂东京热| 熟女91网| 啊啊啊想要| 午夜福利1区2区3区| 综合久久久久久久综合网| 亚洲成人福利电影免费| 婷色五月| 91色综合激情| 色777999综合| 女生久久网| 1人人看人人摸人人操| 五月天婷精品激情| 992这里有精品| 国产偷仑| 校园春色美腿丝袜 | av无线看| 啊v视频在线观看| 91久精品| 嗯~啊~快点 死我视频免费看网站| 国产精品农村妇女精品| av亚欧| 國產尤物AV尤物在線觀看| 色色婷婷五月天| 裸模AV女优| 夜夜久久久| 国产无马在线| 丁香五月天堂| 欧美暴力猛交| 五十路三区在线| 精品国产一区二区三区香蕉欧美| 狠狠综合| 亚洲污污网站| 色在线视频导航| 国产AV高清AV无码| 丝袜综合| 欧美97爱| 中国探花熟女| 久久伊人青青草| 亚洲开心网| 国产黄色av大片网站| 亚洲最大黄网| 熟女少妇视频| 亚州AV无码国产精品| 大香蕉伊人网WWWn0n| 欧美啪啪啪91| 久久成人国产| 麻豆精品A片免费观看| 欧美男人的天堂| 黄色网址在线免费观看| 中文字幕少妇色 | 久久这里只精品99re66图| 西西美女视频网| 大香蕉一级黄色片久久| 97久久视频| 国产av色网| 国产专区第一页| 中文字幕国产| 欧美日韩中文字幕人妻| 国产精品久久久久久久久久久久久久吹 | …亚洲黄色厕厕女女在线播…| 色哟哟综合| 青青草原人妻| 东京热男人天堂| 午夜免费福利视频一区| 蜜桃精品视频一区二区三区| 精品人妻中文字幕4399| 激情久久久| 日韩天天综合| 99色悠悠| 国产亚州精品美女久久久免费| 午夜噜噜噜| 舔人妻中文免费视频| 九九成人精品| 国产av尤物| 国产精品另类一区大香蕉| 日韩美女操b| 久久久网一区| 成人麻豆av电影网站| 欧美日韩少妇色情| 久久男人精品| 亚州中文字幕超碰97| 被男人吃奶很爽的毛片| 青青草在线视频欧美| 18禁在线视频| 亚洲免费97免费| 激情五月天插| 中文字幕第23区| 国产精品久久99日日| 麻豆 亚洲 97| 91人妻尻屄视频| 97人人色| 骚逼高潮久久精品| 亚洲无 码A片在线观看麻豆| 天天综合日韩网| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 日本色色色| 丝袜美腿丝袜| 女人的久久久| 成人无码在线视频网站| 精品无码久久久久| 天天插天天操| 国产久久久| 操美女人妻| 少妇高潮对白在线观看| 69丨亚洲丨精品丨入口免费播放| 毛片电影一区二区三区| 久草在线| 好屌色综合| 99视频自拍| 日本人妻最新在线中| 伊人伊人LD| 大香蕉九九| 视频一区二区三区精品| 97精品97久久| 国产女人高潮视频| 国产Aα| 欧美激情高清性猛交| 国内黄色精品| 日韩一级欧美一级在线观看| 欧美亚洲天堂| 97热视频在线观看| 91肏屄网| 婷婷中文网| 黄片免费日韩| 日韩在线观看AV| 国产SV一线| 女人爽到高潮潮喷18禁网站| 思思热在线视频在线| 日本精品一区二区三| 青娱乐亚洲热| 抽插无码高清一区| 亚洲激情在线观看一区| 91狠狠综合久久| 欧美男人亚洲天堂| 91亚洲青青草原精品1区| 国产亚洲精品玖玖玖在线观看| 91久久青青草原精品| 精久久久| 欧美中字二区| 最新加勒比丝袜在线| 日本精品不卡一二三区| 秋霞免费无码视频日韩A片| 伊人九九| 中文字幕无码不卡啪啪| 97色视频在线| 日本一区二区电影网站| a在线观看| 成人三一级一片aaa| 日韩精品字幕| 色吧91| 超碰诱惑| 亚洲玖玖爱| 男人的天堂无码| 夜夜操一区二区| 麻豆九九九| 日韩在线视频1234| 狠狠干,狠狠操| 成年女人18级毛片毛片免费观看| 手机在线中文字幕国产| 岛国A V在线免费看| 欧洲精品一级二级精品综合视频综合 | 操人妻丝袜高跟| 久综合网| 性爱av网站| 国产三级中文有码在线视频| 无码不卡八戒| 夜夜草天天| 国产精品福利资源在线尤物| 欧美日韩久久精品爱爱| 国产嫩草精品A88AV| 五十路成人在线视频二区三区| 欧美青青视频| 亚洲综合性网址| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 97精品| 羞涩视频| 丰满人妻aA一区二区三区| 999久久久| 天天看天天日天天操| 国产精品美女视频诱惑| 精品综合久久久久久五月天| 精品无码久久久久久久久果冻糖心| 国产熟女一区二区| 大奶的诱惑| 亚洲欧美人妻| 黑人精品XXX一区一二区| 欧美福利视频啊啊啊啊| 人人干黄色| 乱伦图av| 国模精品娜娜一二三区| 五月天大香蕉| 青娱乐亚洲热| 青青草大香蕉在线视频| 青青草狠狠撸| 97精品一区| 精品一区二区三区蜜桃| 91精品91久久久久77777俄罗斯老妇姓x| 91丝袜美女视频| 亚洲av噜噜噜噜噜噜| 免费少妇一区二区| 粉嫩av在线一区二区| 婷婷五月天综合网| 欧美日日夜夜| 走光一区92下载| 欧美日综合| 国产精品视频内谢女人| 欧美黄色大片在线观看| 国产福利影视| 无码99| 久久久久9999精品九九九| 久久久月天| 欧州一区二区三区四区| 嗯啊抽插大香蕉网页| 熟女乱伦二区| 爱干爱射网啊啊啊| 99热8| 激情小说亚洲| 日韩乱伦影音先锋| 亚洲色吧网| 校园春色宗合网| 91丝袜美女视频| 色综合天天| 五月天激情小说| 做爱福利视频一区二区| 国产免费内射视频| 日本性爱欧美性爱| 日韩人妻少妇 一区二区三区| n1038 一二三区| 91麻豆天美国产欧美高潮| 91肉片| 蜜乳AV色欲AVAV无码| 狠狠搞 亚洲91| 午夜美女诱惑电源网| 国产精品爱欲| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 五月天丁香| 2000亚洲男人天堂| 亚州综合在线| 在线观看av区| 久久久久久久久久黄色网| 97精品一区二区视频在线观看| 波多野结衣AV无码一区| 婷婷五月天色| 91 国产丝袜在线播放-百度| 日本一级特级毛片视频| 久操大香蕉| 亚洲国产青青| 亚洲成人黄色在线观看| 九九热精品| 208天天久久九九九| 亚洲,日韩,欧美,成人播放 | 乱伦一二三| 色婷婷丁香五月| 男人天堂最新手机版在线青青草| 色黄污美女啪啪啪免费网站| 97国产超湿| 色五月av| 五月婷婷无码| 久久精品成人| 精品国产www久久| 91处女视频在线观看| 91网九色蝌蚪操熟女| av天天在线观看| 97中文热色| 六月丁香啪啪| 久热伊人| 精品久久99| 后入人妻无码| 国产福利影视| 操老熟女AV| 日韩乱中文 | 国产超碰| 欧美,日韩,中文,另类| 人摸人人操人| 久久精品中文字幕女同| 岛国黄色短视频| 国产性爱欧美性爱在线 | 天海翼久久| 十八禁的黄污污免费网站| 日欧毛片久久| 日本免费一级AAA大片器| 97超碰免费人人性爱| 波多野42部无码喷潮在线观看| 激情亚洲天堂| 亚洲va有码在线天堂| 超碰免费欧美7| 伊人女女资源在线观看| 一本色道久久综合熟妇| 新版天堂中文资源8在线| 天美久久久久| 激情六月天| 久久久九九九| 97在线欧洲| 亚洲第一狼人丝袜美女另类 | 九九综合久久| 久久岛国| 欧美少妇一区二区三区| 精品人妻1区| 九九av| 国产高潮AA片免费看| 快灬快灬 一下爽蜜桃在线观看 | 99久久久无码国产精品性啊聊| 激情图片亚洲色图| 人人操人人插人www| 超碰综合97在线| 婷婷久久综合| 韩国三级一线观看久| 久久99草| 五月丁香综合激情| 国产精品日本无码A片| 精品中文日韩字幕视频| 柠檬AV导航| 丰满人妻一区二区三区色-百度| 精产国品一区二三产品| 亚洲色 国产 欧美 日韩| 欧美性爱超碰97| 亚洲AV资源| 国产真实野战在线视频| 夜夜嗨视频| 亚洲综合射| 五月天激情网站| 国产极品精品美女视频| 插插综合网天天影视网| 啊啊啊啊啊在线观看网址| av网站在线观看了| 国产一二三福利视频网| 青青草视频在线观看一区二区| 一本一道vs波多野结衣| 欧美天天弄| 天堂精品| 97欧美精品综合| 亚洲中文字幕精品久久久久久直播| 大香蕉欧美| 亚洲极品| 久久夜夜夜夜| 水野优香在线观看| 日韩欧美成人性爱在线| 91人人操| 中文字幕免费看| 97色欧州| 极品色社| 亚洲性爱无码乱伦av| 亚洲欧美色图小说| 大逼色网站| 亚洲日韩东京热一区| 嗯啊啊啊轻点视频 | 日韩一级二级三级免费看完整版国语版 | 精品伊人久久久大香线蕉小说| 日韩精品 欧美激情| 91影视亚洲| 无码人妻丰满熟妇奶水区毛片| 久久综合九九| 久久久免费一级黄片| 女同女同恋久久级三级| 国产农村妇女精品| 噜噜噜噜久久久精品免费| 操少妞在线视频| 国产熟妇一区二区| 7月婷婷综合| 天天色综合图片| 9久热| 国产 v乱码一区二| 日韩图区 偷拍| 亚洲 小说 欧美 激情 另类| 热热色中文无码| 伊人性在线视频| 色婷婷一区二区三区久久午夜| 91网站18在线| 欧美亚洲国产自久久| 人妻夜夜爽天天爽麻豆三区网站 | 狼天天狼天天大香蕉| 久久免费精彩视频| 亚洲激情av| 国产日韩欧美三级片| 国产情侣自拍在线播放| 亚洲av淫乱| 8050无码八戒| 国产精品午夜高潮呻吟久久av| 人摸人人操人| 日韩av在线免费网站| 久操网线| 人人干人人操人人..com| 久久九九视频九九视频| 日韩Va亚洲va欧美Ⅴa久久| 日本免费专区| 97露脸精品丝袜| 又黄又粗又硬又长又大| 久久综合18p| 久久久久久久 九九九九九九九| 天综合网| 嗯嗯啊啊操死我| 第二页中文字幕| 诱惑人妻欧美一区在线播放| 91成人在线| 激情人妻另类| 91麻豆天美国产欧美高潮| 91欧美www| 国产精品亚洲天堂网址| 亚洲日韩精品久久久久一区壹牛| 亚洲一区中文精品| 国产性爱在线视频一区二区| 欧美操逼熟女|