面試題 一:從尾到頭列印單鏈表。
/// 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...