鍊錶的基本操作
逆序列印單鏈表
刪除鍊錶的非尾結點,要求:不能遍歷鍊錶
在鍊錶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...