C語言鏈表面試題 增強版

2021-08-15 11:10:52 字數 4060 閱讀 1923

面試題 一:從尾到頭列印單鏈表。

///  1.從尾到頭列印單鏈表 //

void slitsprinttailtohead(slistnode* phead)//非遞迴演算法(利用倆個指標乙個定義到尾部p1,另乙個定義到頭開始迴圈p2,每當p2迴圈到尾部時,輸出p2的值,讓尾部p1指向p2.再次開始迴圈,以此往復。)

printf("%d ",tail->data);

cur=tail; }}

void slistprinttailtoheadr(slistnode* phead)//遞迴演算法

slistprinttailtoheadr(phead->next);

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

}///

面試題二:刪除乙個無頭單鏈表的非尾節點(不能遍歷鍊錶) 

void slistdelnontailnode(slistnode* pos)//應用了向前替換法,把後乙個的值賦值給pos替換原值,然後把pos指向pos下乙個的下乙個。

面試題三:在無頭單鏈表的乙個節點前插入乙個節點(不能遍歷鍊錶) 

void slistinsertfrontnode(slistnode* pos, datatype x)

面試題四

:單鏈表實現約瑟夫環(josephcircle) 

/ 4.單鏈表實現約瑟夫環(josephcircle) 約瑟夫環就比如說一群人圍成乙個圈,從乙個人開始報數,如報到3的人就退出,下乙個繼續從1開始,直到只剩乙個人時結束。

slistnode* slistjosephcircle(slistnode* phead, int k)//phead是乙個迴圈鍊錶

nx=cur->next;//利用替換法不需要遍歷鍊錶進行刪除節點

cur->data=nx->data;

cur->next=nx->next;

free(nx);

} return cur;

}

面試題五:逆置/反轉單鏈表

slistnode* slistreverse(slistnode* list)//逆置/反轉單鏈表 (重要多看看)

return newlist;

}

面試題六:單鏈表排序(氣泡排序&快速排序) 

void slistbubblesort(slistnode* list)//單鏈表排序(氣泡排序&快速排序) 氣泡排序倆倆比較。

_next=_next->next;

cur=cur->next;

} if (change==0)

tail=cur;

}}

面試題七:合併兩個有序鍊錶,合併後依然有序 

slistnode* slistmerge(slistnode* list1, slistnode* list2)//合併兩個有序鍊錶,合併後依然有序 

if (list1==null)

if (list1->data < list2->data)

else

while (list1&&list2)

else

newlist=newlist->next;

} if (list1)

if (list2)

return list;

}

面試題八:查詢單鏈表的中間節點,要求只能遍歷一次鍊錶 

slistnode* slistfindmidnode(slistnode* list)//8.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶 

return cur;

}

面試題九:查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶 

slistnode* slistfindtailknode(slistnode* list, size_t k)//9.查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶 

fast=fast->next;

} while(fast)

return cur;

}

面試題十:刪除鍊錶的倒數第k個結點 

void slistfindpop(slistnode *list,size_t k)//10.刪除鍊錶的倒數第k個結點 

list->next=cur->next;

free(cur);

}

面試題十一:判斷是否帶環

slistnode* slistiscycle(slistnode* list)//11.判斷是否帶環		}

return null;

}

面試題十二:求環的長度

int slistcyclelen(slistnode* meetnode)//12.求環的長度

return n;

}

面試題十三:求環的入口點(環的入口點就是乙個從鍊錶開始另乙個從相遇點開,當他們相交的點就是入口點)

slistnode* slistcrossentrenode(slistnode* list, slistnode* meetnode) //13.求環的入口點(環的入口點就是乙個從鍊錶開始另乙個從相遇點開,當他們相交的點就是入口點)

return list;

}

面試題十四:判斷兩個鍊錶是否相交。(假設鍊錶不帶環)

int slistiscrossnode(slistnode* list1, slistnode* list2)//14.判斷兩個鍊錶是否相交,若相交,求交點。(假設鍊錶不帶環)

while(list2 &&list2->next)

if (list2==list1 && list1!=null)

return 0;

}

面試題十四(2):兩個鍊錶相交,求交點。

slistnode *slistenternode(slistnode* list1,slistnode* list2)//兩個鍊錶相交,求交點。

while (cur2->next)

cur1=list1;

cur2=list2;

if (n1-n2 >=0)

while (cur1!=cur2)

} else

while (cur1!=cur2)

}return cur1;

}

測試**:

void test1()//1.從尾到頭列印單鏈表

void test2()//2.刪除乙個無頭單鏈表的非尾節點(不能遍歷鍊錶)

void test3()//3.在無頭單鏈表的乙個節點前插入乙個節點(不能遍歷鍊錶)

void test4()//4.單鏈表實現約瑟夫環(josephcircle)

void test5()//5.//逆置/反轉單鏈表

void test6()//6.單鏈表排序(氣泡排序&快速排序)

void test7()//7.合併兩個有序鍊錶,合併後依然有序

void test8()//8.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶

void test9()//9.查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶

void test10()//10.刪除鍊錶的倒數第k個結點

void test11_12_13()//11.判斷是否帶環 12.求環的長度 13。求環的入口點

void test14()//14。判斷兩個鍊錶是否相交,若相交,求交點。(假設鍊錶不帶環)

主函式:

int main()

鏈表面試題

不改變鍊錶結構,從尾到頭列印單鏈表 遞迴實現 void printlistrevers recursively plist phead printf d phead data 當鍊表非常長的時候,遞迴實現的會導致函式呼叫層級很深,可能導致呼叫棧溢位。用棧不會出現此類情況,顯然用棧實現 的魯棒性會好一...

鏈表面試題

從尾到頭列印單鏈表 棧 遞迴 從尾到頭列印鍊錶 includevoid printtailtohead listnode head while s.empty 空間複雜度o n void printtailtoheadr listnode head cout data 刪除乙個無頭單鏈表的非尾結點 ...

鏈表面試題

typedef int datatype typedef struct node node,pnode,plist void initlist plist pplist void display const plist plist void pushback plist pplist,datatyp...