一、單鏈表結點的刪除
0、刪除單鏈表p指向的那個元素,(時間和空間複雜度盡量小)
二、單鏈表的訪問
1、找出單鏈表的倒數第k個元素,(僅允許遍歷一遍鍊錶)
2、找出單鏈表的中間元素,(僅允許遍歷一遍鍊錶)
三、單鏈表與環的問題
3、判斷單鏈表是否有環(6形狀)?
4、如何找到環的入口?
5、如何知道環的長度?
6
、帶環鍊錶的長度是多少?
四、單鏈表與相交、環的問題
7、如何知道兩個單鏈表(無環)是否相交
8、如果兩個單鏈表(無環)相交,如何知道它們相交的第乙個節點是什麼
9、如何知道兩個單鏈表(有環)是否相交
10、如果兩個單鏈表(有環)相交,如何知道它們相交的第乙個節點是什麼
參考:
第2部分
1、給定單鏈表的頭指標和乙個結點指標,在o(1)時間刪除該結點。
演算法描述:刪除單鏈表的乙個節點需要知道該節點的前驅和後繼。實際上找到前驅的平局時間複雜化度就是o(1).
傳送陣:
2、輸入乙個單向鍊錶,輸出該鍊錶中倒數第k個結點。鍊錶的倒數第0個結點為鍊錶的尾指標。
演算法描述:定義兩個節點指標p1,p2,使p2-p1相距為k,然後同步後移,當p2為鍊錶節點尾指標時,p1即為倒數第k個節點。
傳送陣:
3、判斷乙個單向鍊錶是否有環。
演算法描述:初始定義兩個指標p1,p2均指向煉表頭,使其中乙個步長為1,另乙個步長為2。在到達鍊錶尾節點前出現p1==p2,即該單鏈表有環。
4、尋找單向鍊錶的環入口,即進入環的第乙個節點。
演算法描述:1)判斷該鍊錶是否有環,即初始定義兩個指標p1,p2均指向煉表頭,使其中乙個步長為1,另乙個步長為2。判斷在到達鍊錶尾節點前出現p1==p2,如果不存在,則無環,如果存在,設p=p1.
2)設q為煉表頭節點,將q與p同時以步長為1後移,當二者相同時,即為環入口。
演算法分析與原始碼:
5、給定兩個單向鍊錶,找出它們的第乙個公共結點。
問題分析:1)如果他們存在公共節點,那麼第乙個公共節點後的鏈結節點將是相同的;
2)需要判斷兩個單鏈表是否有環。
3)兩個鍊錶中沒有環的演算法:假設兩個鍊錶的長度分別為m,n,(m>=n),則將長鍊錶的第m-n+1個節點與短鍊錶的頭節點對齊,依次比較後繼節點,第乙個相同的節點就是第乙個公共節點。
演算法描述:1)計算兩個鍊錶的環入口,如果無環則環入口為null;
2)如果兩個鍊錶的環入口均為null,則兩個鍊錶均沒有環,按兩個鍊錶均沒有環的演算法處理;
3)如果兩個鍊錶的環入口只有乙個為null,則兩個鍊錶無公共交點;
4)如果兩個鍊錶的環入口均不為null,且相同,則將環入口作為兩個鍊錶的尾節點,按沒有換的兩個鍊錶求第一公共節點處理
5)如果兩個鍊錶的環入口均不為null,且不同,則需要判斷乙個鍊錶的環入口是否在另乙個鍊錶的環上,如果不在,沒有公共節點,如果在,則可認為任一環入口為第一公共節點
演算法具體分析與原始碼:
6、複雜鍊錶的複製
有乙個複雜鍊錶,其結點除了有乙個m_pnext指標指向下乙個結點外,還有乙個m_psibling指向鍊錶中的任一結點或者null。其結點的c++定義如下:
struct complexnode
;
請完成函式complexnode* clone(complexnode* phead),以複製乙個複雜鍊錶。
演算法分析:首先設原鍊錶為:a-b-c-d-e,接著插入新鍊錶a-a'-b-b'-c-c'-d-d'-e-e',新節點中的m_psibling全設為null。第一遍完成以後,第二遍遍歷鍊錶,更新a',b',c',d',e'的m_psibling域(更新方法,以a'為例,a'->m_psibling=a'的前乙個節點的m_psibling->next)。第三遍把鍊錶拆成兩個部分。演算法複雜度o(n)
7、將乙個二元查詢樹轉換為乙個排序的雙向鍊錶
問題描述:輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。
演算法分析:中序遍歷二元查詢數的結果就是有序的目標節點順序。只需按中序遍歷的順序把節點鏈結到鍊錶尾端即可。
傳送陣:
8、合併兩個有序的單向鍊錶
問題分析:1)沒有說明兩個鍊錶是否交叉,需要考慮這種情況
2)合併兩個不交叉的有序單向鍊錶的演算法:設排序規則為g(x1, x2),同步遍歷兩個鍊錶的游標指標p1,p2,插入游標p;如果滿足g(p1,p2)則將p1插入p後,p和p1後移;否則將p2插入p後,p和p2後移。如果p1,或p2有乙個為null,則將另乙個指標後的所有元素插入到p後。
演算法描述:設排序規則為g(x1, x2),同步遍歷兩個鍊錶的游標指標p1,p2,插入游標p;
1)初始化p1為鍊錶1的頭指標,p2為鍊錶2的頭指標,p=null;
2)如果p1==p2,則兩個鍊錶存在公共點,p1後的所有節點相同,將p1後的所有節點鏈在p後,結束。
3)如果p1或p2有乙個為null,將非空的那個指標後的所有元素鏈在p後,結束
4)如果滿足g(p1,p2)則將p1插入p後,p和p1後移,否則將p2插入p後,p和p2後移;繼續步驟2)
9、單鏈表交換任意兩個節點(不含表頭)
演算法描述:將兩個節點儲存的資料進行交換即可。不必真的交換節點。
10、用單鏈表模擬大整數加法運算
問題描述:例如:9>9>9>null + 1>null => 1>0>0>0>null
問題分析:設兩個鍊錶a,b,求鍊錶c,滿足c=a+b
演算法一:將鍊錶a和b反轉,將a和b相加合併。將進製加到下一節點,如果乙個比較長,直接合併;如果最後有乙個進製,在鍊錶尾建立新的節點。最後將合併後的鍊錶再次反轉。
演算法二:求得鍊錶a和b的長度,以遞迴的方式計算對應為相加,如果有進製,在煉表頭插入新建節點。
11、將二級單鏈表展開成一級單鏈表
問題描述:有個二級單鏈表,其中每個元素都含有乙個指向乙個單鏈表的指標。寫程式把這個二級鍊錶展開成一級單鏈表。
/*這個二級單鏈表只包括一些head*/
public class link
}public class cascadelink}
演算法描述:遍歷,使a.next的尾節點.next = a.nexthead.next.
12、單鏈表排序
演算法分析:單鏈表元素交換有兩種:一、直接交換值;二、交換節點。並且單鏈表執行插入操作時不會引起資料移動。
傳送陣:參考
13、刪除單鏈表中重複的元素
演算法描述:使用hashtable輔助,如果存在即刪除,如果不存在將值寫入hashtable。
14、刪除兩個雙向迴圈鍊錶中值相同的節點。
演算法描述:1)的map物件m,其中key為鍊錶的值,value為鍊錶節點指標;遍歷雙向迴圈鍊錶a,構造鍵值對寫入輔助物件m中
2)遍歷b,如果當前節點cur的值在map中存在,刪除cur節點並使cur後移,同時判斷m[cur.value]的值是否為null,如果不為空刪除其對應在a中的節點,並使m[cur.value]=null
參考:第3部分 (有c#**)
1.單鏈表反轉
2.找出單鏈表的倒數第4個元素
3.找出單鏈表的中間元素
4.刪除無頭單鏈表的乙個節點
5.兩個不交叉的有序鍊錶的合併
6.有個二級單鏈表,其中每個元素都含有乙個指向乙個單鏈表的指標。寫程式把這個二級鍊錶稱一級單鏈表。
7.單鏈表交換任意兩個元素(不包括表頭)
8.判斷單鏈表是否有環?如何找到環的「起始」點?如何知道環的長度?
9.判斷兩個單鏈表是否相交
10.兩個單鏈表相交,計算相交點
11.用鍊錶模擬大整數加法運算
12.單鏈表排序
13.刪除單鏈表中重複的元素
參考:
單鏈表常見面試題
ifndef linklist h define linklist h define crt secure no warnings include include include string h include typedef int datatype typedef struct node no...
單鏈表常見面試題
一 獲取單鏈表的節點個數 思路 遍歷鍊錶 head 煉表頭結點 param head return 方法 獲取到單鏈表結點的個數 如果是帶頭結點的鍊錶,不統計頭結點 public static int getlength heronode head int length 0 定義乙個輔助變數,沒有統...
hr常見面試題及答案
1 簡單自我介紹 檢視答案 2 你為什麼想離開現在的工作單位?檢視答案 3 你現在找工作,考慮的幾個最重要的因素有哪些?檢視答案 4 你對我們公司了解有多少?檢視答案 5 你對自己未來有什麼規劃,想走技術路線還是管理路線 檢視答案 6 你對期望的薪資是多少 檢視答案 7 你有什麼優點 檢視答案 8 ...