單鏈表常見面試題

2021-08-03 02:01:26 字數 4057 閱讀 5798

#ifndef _linklist_h__

#define _linklist_h__

#define _crt_secure_no_warnings

#include

#include

#include

<

string

.h>

#include

typedef int datatype;

typedef struct node

node,*pnode,*plist;

void initlist(plist* pplist);

//尾插法

void pushback(plist* pplist);

//排序

void bubblesort(plist* pplist);

//列印單向鍊錶

void reverseprint(plist plist);

//刪除無頭單鏈表的非尾結點

void erasenottail(pnode pos);

//在無頭單鏈表的非頭結點前插入乙個元素

void insertfrontnode(pnode pos, datatype x);

//約瑟夫環問題

void josephcycle(plist* pplist, int k);

//逆序單向鍊錶

void reverselist(plist* pplist);

//合併兩個有序列表

plist merge(const plist* p1, const plist* p2);

//查詢單鏈表的中間節點,要求只能遍歷一次鍊錶

pnode findmidnode(plist plist);

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

pnode findknode(plist plist, int k);

//判斷鍊錶時候帶環

pnode checkcircle(plist plist);

//求環的長度

int getcirclelength(pnode meet);

//求環的入口點

pnode getcycleentrynode(plist plist, pnode meet);

//判斷兩條單項鍊表時候相交

int checkcross(plist list1, plist list2);

//求交點

pnode getcrossnode(plist list1, plist list2);

#endif

#define _crt_secure_no_warnings

#include

"linklist.h"

pnode buynode(datatype x)

tmp->

data

= x;

tmp->next =

null;

return tmp;

}void initlist(plist* pplist)

//尾插法

void pushback(plist* pplist,datatype x)

else

cur->next = newnode;

}}//排序

void bubblesort(plist* pplist)

while (cur != tail)

cur = cur->next;

}tail = cur;

cur =

*pplist;

}}//列印單向鍊錶

void display(plist plist)

printf("end\n");

}//查詢x所在的節點

pnode find(plist pplist,datatype x)

else

cur = cur->next;

}return

null;

}}//刪除無頭單鏈表的非尾結點

void erasenottail(pnode pos)

//在無頭單鏈表的非頭結點前插入乙個元素

void insertfrontnode(pnode pos, datatype x)

//約瑟夫環問題

void josephcycle(plist* pplist, int k)

//逆序單向鍊錶

void reverselist(plist* pplist)

*pplist = p;

}//合併兩個有序列表 非遞迴

plist merge(const plist* p1, const plist* p2)

//乙個為空,乙個非空

if ((*p1 ==

null) && (*p2 !=

null))

if ((*p2 ==

null) && (*p1 !=

null))

//2個都不為空

if (cur1->

data

< cur2->

data)

else

cur = newnode;

while (cur1&&cur2)

else

}if (cur1 ==

null)

else

return newnode;

}//查詢單鏈表的中間節點,要求只能遍歷一次鍊錶

pnode findmidnode(plist plist)

else

return slow;

}}//查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶

pnode findknode(plist plist, int k)

int i =

0; for (i; i < k-

1; i++)

}fast = fast->next;

while (fast)

return slow;

}//判斷鍊錶是否帶環

pnode checkcircle(plist plist)

else

}return

null;

}}//求環的長度

int getcirclelength(pnode meet)

while (cur!=meet);

return count;

}//求環的入口點

pnode getcycleentrynode(plist plist, pnode meet)

//判斷兩條單項鍊表時候相交

int checkcross(plist list1, plist list2)

while (cur1->next)

while (cur2->next)

if (cur1 == cur2)

return0;}

//求交點

pnode getcrossnode(plist list1, plist list2)

while (cur2->next)

int diff = abs(len2 - len1);

if (len1 > len2)

else

for (int i =

0; i < diff; i++)

while (cur1 != cur2)

return cur1;

}#define _crt_secure_no_warnings

#include

"linklist.h"

void test1()

void test2()

void test3()

void test4()

void test5()

void test6()

void test7()

else

c = getcrossnode(s1, s2);

printf("%d\n", c->

data);

}int main()

單鏈表常見面試題

一 獲取單鏈表的節點個數 思路 遍歷鍊錶 head 煉表頭結點 param head return 方法 獲取到單鏈表結點的個數 如果是帶頭結點的鍊錶,不統計頭結點 public static int getlength heronode head int length 0 定義乙個輔助變數,沒有統...

單鏈表的常見面試題

單鏈表的基礎操作 單鏈表建立面試題 1.從尾到頭列印單鏈表 2.刪除乙個無頭單鏈表的非尾節點 不能遍歷鍊錶 3.在無頭單鏈表的乙個非頭節點前插入乙個節點 不能遍歷鍊錶 4.單鏈表實現約瑟夫環 josephcircle 5.逆置 反轉單鏈表 6.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶 void p...

單鏈表常見面試題及答案

一 單鏈表結點的刪除 0 刪除單鏈表p指向的那個元素,時間和空間複雜度盡量小 二 單鏈表的訪問 1 找出單鏈表的倒數第k個元素,僅允許遍歷一遍鍊錶 2 找出單鏈表的中間元素,僅允許遍歷一遍鍊錶 三 單鏈表與環的問題 3 判斷單鏈表是否有環 6形狀 4 如何找到環的入口?5 如何知道環的長度?6 帶環...