鍊錶的常見面試題

2021-08-18 20:27:27 字數 4376 閱讀 3836

鍊錶的基本操作

逆序列印單鏈表

刪除鍊錶的非尾結點,要求:不能遍歷鍊錶

在鍊錶pos位置前插入值到data的結點

查詢鍊錶的中間結點,要求只能遍歷一次鍊錶

查詢鍊錶的倒數第k個結點,要求只能遍歷一次鍊錶

刪除鍊錶的倒數第k個結點,要求只能遍歷一次鍊錶

用單鏈表實現約瑟夫環

鍊錶的逆置–三個指標

鍊錶的逆置–頭插法

用氣泡排序思想對單鏈表進行排序

合併兩個有序單鏈表,合併後依然有序

判斷兩個單鏈表是否相交—鍊錶不帶環

求兩個單鏈表相交的交點—鍊錶不帶環測試

判斷鍊錶是否帶環,返回相遇點

獲取環的入口點

獲取環的長度

判斷兩個鍊錶是否相交,鍊錶可能帶環測試

複雜鍊錶的複製

逆序列印單鏈表

void printslistfromtail2head(pnode phead)       

while (ptail!=phead)

printf("%d->", ptail->_data);

ptail = ppre;

}printf("%d->null\n", ptail->_data);

//遞迴實現

#if0

if(phead->_pnext)

printf("->%d", phead->_data);

#endif

}

刪除鍊錶的非尾結點,要求:不能遍歷鍊錶

void deletelistnottailnode(pnode pos)

在鍊錶pos位置前插入值到data的結點

/*在鍊錶後邊插入,然後將pos的值給後邊的,再將值給pos*/

void

inesrtposfront(pnode pos, datatype

data)

查詢鍊錶的中間結點,要求只能遍歷一次鍊錶

/*定義兩個指標,乙個一次走兩步,乙個走一步*/

pnode findmiddlenode(pnode phead)

else

if (null

== phead->_pnext)

else

return pslow;

}}

查詢鍊錶的倒數第k個結點,要求只能遍歷一次鍊錶

pnode findlastknode(pnode phead, int k)

while (k--)

while (pfast)

return pslow;

}

// 刪除鍊錶的倒數第k個結點,要求只能遍歷一次鍊錶

void deletelastknode(pnode phead, int k)

while (k--)

while (pfast)

ppre->_pnext = pslow->_pnext;

free(pslow);

pslow =

null;

}

用單鏈表實現約瑟夫環

void josephcircle(pnode* phead, const int m)

pcur =

*phead;

//先遍歷鍊錶,讓尾指向頭

while (pcur->_pnext)

pcur->_pnext =

*phead;

pcur =

*phead;

while ((pcur)->_pnext != pcur)

//刪節點

pdel = pcur->_pnext;

pcur->_data = pdel->_data;

pcur->_pnext = pdel->_pnext;

free(pdel);

pdel =

null;

}//解環

pcur->_pnext =

null;

slistprint(pcur);

}

鍊錶的逆置–三個指標

void reverseslist(pnode* phead)

*phead = ppre;

}

鍊錶的逆置–頭插法

pnode reverseslistop(pnode phead)

phead = pcur;

return phead;

}

用氣泡排序思想對單鏈表進行排序

void bubblesort(pnode phead)

while (ptail != phead)

pcur = pcur->_pnext;

}ptail = pcur;

if (0

== flag)

break;

}}

合併兩個有序單鏈表,合併後依然有序

pnode mergeslist(pnode phead1, pnode phead2)

else

if (phead1->_data < phead2->_data)

while (phead1&&phead2)

else

if (phead1->_data < phead2->_data)

}while (phead1)

while (phead2)

return pnewhead;

}

判斷兩個單鏈表是否相交—鍊錶不帶環

int isslistcross(pnode phead1, pnode phead2)

while (phead2->_pnext)

if (phead1 == phead2)

else

}

求兩個單鏈表相交的交點—鍊錶不帶環

/*先讓長的鍊錶遍歷size1-size2,再讓兩個鍊錶一起遍歷,

當pcur1==pcur2時,兩鍊錶相交*/

pnode getcorssnode(pnode phead1, pnode phead2)

while (pcur2)

gap = size1 - size2;

pcur1 = phead1; pcur2 = phead2;

if (gap >

0)

}else

}while (pcur1 != pcur2)

return pcur2;

}

測試程式

void testinterview()

判斷兩個鍊錶是否相交,鍊錶可能帶環

pnode islistwithcircle(pnode phead1)

return

null;

}

獲取環的入口點

pnode getcircleenter(pnode phead1, pnode pmeetnode)

else

}return pm;

}

獲取環的長度

int getcirclelen(pnode pmeetnode)

else

}return len;

}

判斷兩個鍊錶是否相交,鍊錶可能帶環

int isslistcrosswithcircle(pnode phead1, pnode phead2)

return

0;}

測試

void testinterview2()

複雜鍊錶的複製

pcslnode copycomplexlist(pcslnode phead)

pcur = phead;

//2.給新節點的隨機指標域賦值

//讓隨機指標域指向原節點隨機指標指向的下個節點

while (pcur)

pcur = pnewnode->_pnext;

}//3.將新節點從原煉表中拆下來

pcur = phead;

pnewhead = phead->_pnext;

while (pcur->_pnext)

return pnewhead;

}

鍊錶常見面試題

1 如何判斷乙個單鏈表有環 2 如何判斷乙個環的入口點在 3 如何知道環的長度 4 如何知道兩個單鏈表 無環 是否相交 5 如果兩個單鏈表 無環 相交,如何知道它們相交的第乙個節點是什麼 6 如何知道兩個單鏈表 有環 是否相交 7 如果兩個單鏈表 有環 相交,如何知道它們相交的第乙個節點是什麼 1 ...

常見面試題

1.get和post的區別 1 本質區別 get是向伺服器請求資料,post是向伺服器傳送資料。2 伺服器獲取值的方式 get方式提交的資料,伺服器端使用request.querystring獲取變數的值。post方式提交的資料,伺服器端使用request.form獲取資料。3 安全性 get安全效...

常見面試題

1 一行 實現1 100之和 lst i for i in range 1,101 print sum lst 2 如何在乙個函式內部修改全域性變數?在函式內部新增 global 變數名 這樣就可以在本地作用域定義全域性作用域了 name 大明 def eat name1 global name n...