王道考研資料結構鍊錶 綜合習題題解

2021-09-27 03:59:26 字數 2945 閱讀 8563

q2q1:遞迴刪除不帶頭節點的單鏈表中所有為x的值

ans:

void function(int x,singlelist &l)

function(x,p->next);

}

q2:帶頭節點的單鏈表刪除所有值為x的節點並釋放記憶體

ans:

void function(int x,singlelist &l)

}}

q3:反向輸出鍊錶資料

ans:遍歷鍊錶,將資料取出存入陣列,陣列反向輸出

q4:刪除最小節點

ans:聯想刪除陣列最小值,遍歷陣列使用min記錄最小值下標,一輪遍歷結束後再刪除最小值。這裡使用minp指向最小值的前驅,一輪遍歷結束用minp->next = minp->next->next

q5:單鏈表原地逆轉

ans:聯想順序表的原地逆轉,用乙個swap(a,b)完成元素關於中心點交換順序。這裡使用swap函式完成節點關於中心點交換位置。由於限制空間,我們可以犧牲時間來換取空間。

q6:亂序單鏈表公升序

ans:用輔助陣列取出單鏈表的資料,排序後再順序放入單鏈表內。

q7:亂序單鏈表刪除所有介於a,b的值。

ans:迴圈遍歷鍊錶,符合條件刪除即可。

q8:找出兩個鍊錶的公共節點。

ans:如果找尋多個公共節點的話,我覺得得改編一下lcd演算法,如果僅僅找乙個公共節點的話雙重for迴圈尋找就行。

q9:亂序單鏈表公升序輸出。

ans:雙重迴圈,內迴圈尋找最大值輸出並刪除最大節點然後釋放最大節點的記憶體,外迴圈控制內迴圈次數。

q10:單鏈表拆分成兩個單鏈表。

ans:太簡單,不說了。

q11:單鏈表就地拆分成兩個單鏈表。

ans:就地拆分要求輔助空間為o(1),a1,b1,a2,b2,a3,b3觀察一下發現b1和a3交換可以實現a全部在左邊,b全部在右邊,變成a1,a3,a2,b2,b1,b3。然後a3,a2交換,b2,b1交換就可以實現a1,a2,a3,b1,b,2,b3然後拆分得到a,b。這題需要先將a交換到左邊,b交換到右邊,拆分後各自交換內部順序就可以了。內部交換順序不能使用遞迴函式!遞迴呼叫系統棧,造成額外的輔助空間!導致輔助空間超過o(1)。

q12:刪除單鏈表中重複的值。

ans:沒說不能使用set,借用順序表中去除重複值的方法,將資料取出放入set,使用迭代器遍歷放入鍊錶,然後截斷鍊錶,釋放後面多餘節點的記憶體。

q13:將兩個公升序鍊錶歸併為乙個降序鍊錶

ans:使用雙重迴圈將兩個公升序鍊錶歸併為乙個公升序鍊錶,然後對公升序鍊錶做對稱變化。

q15:抽取公升序a,b鍊錶公共節點放入a中

ans:如果沒有公升序這個條件我覺得需要用到lcd演算法,但是說了公升序,那就簡單多了。

a的指標後移在未找到第乙個不小於b指標所指元素前都刪除節點,否則如果數值相等將b指標所指節點插入a指標,a,b同時後移一位,如果b>a,則b指標後移一位。這種演算法借助了求最長遞增子串行的思想,時間複雜度是o(nlog n),比兩個鍊錶雙重迴圈從頭到尾o(n^2)判斷快。

singlelist function(singlelist &a,singlelist b)

//找到等於的節點將該節點連線上a

if(q->next->data = b->next->data;)

//b後移一位

b = b->next;

} return a;

}

q14:在15的基礎上不破壞表a,b

ans:直接用陣列取出a,b的元素,求最長公共子串行就行了。

q16:判斷b是否為a的連續子串行

ans:沒想到好方法,暴力列舉吧,b中只要有乙個元素不和a相同就退出一次外迴圈。時間複雜度為o(n^2)

q17:判斷帶頭節點的迴圈雙鏈表是否對稱

ans:迴圈雙鏈表是有prior指標的,可以向前搜尋也可以向後搜尋。所以直接搜尋,如果向前和向後同步搜尋遇到乙個不相同的就不是對稱的。如果前行指標p和後行指標q同時指向乙個節點或者p->next = q && q->prior = p,搜尋結束。

q18:將兩個迴圈單鏈表合併為乙個迴圈單鏈表。

ans:a表找到表尾,連上b表的頭節點,b表找到表尾,連上a表頭節點。沒什麼難度。

q19:將最小的節點刪除直到表空,最後刪除頭節點。

ans:這個讓我想起了約瑟夫環問題,其實是一樣的。包含兩個函式地乙個是找最小值的前驅,第二個是刪除最小值節點。外面套乙個迴圈,最後刪除頭節點。

q20:根據訪問頻度排序,相同頻度最近一次訪問排在最前。

ans:讓我想起了作業系統的任務排程。索性我不考作業系統,不然又得頭疼。1.題目沒有說明節點位址是否可以修改,2.沒有說明x是否重複。故我設想節點位址可修改,x位址可修改,使用pair<>陣列將每個節點的資料和頻度取出,將x的頻度+1後按照頻度進行排序,然後放回鍊錶內。

q21:輸出倒數第k個節點對應的data。

ans:判斷k是否會超過鍊錶長度,如果超過直接返回0,沒有超過則將頭指標後移並length-k+1位,返回1。

int getlength(singlelist l)

int find_k(singlelist head)

q22:找到相同字尾。

ans:我能想到的最快的辦法是以空間換時間,將兩個鍊錶的資料分別取出存入陣列a,b,a的長度位lena,b的長度位lenb,a,b逆序尋找第乙個不相同的字母位置k,k即為所求位置。然後鍊錶a頭指標後移lena-k+1,鍊錶b頭指標後移lenb-k+1,就是鍊錶對應相同字尾的開始節點位置。這種做法寫法也比較簡單,**不寫了。四個平行單重迴圈,故時間複雜度位o(n)。

q23:單鏈表絕對值去重。

ans:這類題目貌似在各種抽象資料型別裡面都比較吃香,我一直建議使用set容器去重,然後放回鍊錶中。

題目要求給出資料型別定義,下面給出抽象資料型別。

class singlelist;

王道考研資料結構佇列 綜合習題題解

q1 使用tag標籤判斷隊滿隊空。寫出出入隊的操作。ans 我直接給出抽象資料型別吧。include define maxsize 50 using namespace std class cyclequeue cyclequeue cyclequeue cyclequeue enqueue int...

2021 王道考研 資料結構 習題講解

2021王道資料結構高畫質pdf p1 2021版 0.0 課程指南 p2 2021版 1.1.0 開篇 資料結構在學什麼 p3 2021版 1.1.1 資料結構的基本概念 p4 2021版 1.2.1 演算法的基本概念 p5 2021版 1.2.2 演算法的時間複雜度 p6 2021版 1.2.3...

王道資料結構鍊錶習題實現(持續更新)

typedef struct lnodelnode,linklist typedef struct lnodelnode,linklist 遍歷單鏈表 void printlinklist linklist l printf n 頭插法建立單鏈表 void createlinklist linkli...