一、鍊錶與陣列的比較:
(1)陣列:
b.可以使用折半查詢元素,效率較高;
陣列缺點:a.空間連續,儲存效率低;
b.插入和刪除元素效率比較低;
(2)鍊錶:
鍊錶優點:a.插入和刪除元素不需要移動其餘元素,效率高,為o(1);
b.不要求連續空間,空間利用效率高;
鍊錶缺點:a.不提高隨機訪問元素的機制;
b.查詢元素和搜尋元素的效率低,最快情況下為o(1),平常情況為o(n);
二、鍊錶與陣列在空間中儲存圖示:
(1)陣列的儲存方式:是連續存放的
(2)鍊錶的儲存方式:不是連續存放的
三、**區:
(鍊錶的實現與鍊錶的面試題的實現)
標頭檔案(#linklist.h)
#ifndef _link_h__
#define _link_h__
#include#include#include#includetypedef int datatype;
typedef struct node
node, *pnode;
void initlinklist(pnode *head); //初始化函式
void pushfront(pnode *head,datatype d); //頭插
void popfront(pnode*head); //頭刪
void pushback(pnode *head, datatype d); //尾插
void popback(pnode*head); //尾刪
void reverse(pnode*head); //逆序
void insert(pnode*head,datatype d,int pos); //指定位置插入資料
void delnottail(pnode pos); //刪除無頭的不為結尾的任意乙個節點
pnode find(pnode head,datatype d); //查詢函式
pnode findmidnode(pnode plist); //找中間節點的位置
pnode checkcycle(pnode plist); //檢測是否帶環
int getcirclelength(pnode meet); //求環的長度
pnode getcircleentrynode(pnode meet, pnode plist); //獲取環的進入點
pnode checkcross(pnode p1, pnode p2); //兩條鏈的交點
void josephcycle(pnode plist, int k); //約瑟夫環
void delknode(pnode plist, int k); //刪除倒數第k個節點
void sortlist(pnode head); //氣泡排序
void reverseshow(pnode head); //逆序列印
pnode merge(pnode plist1, pnode plist2); //兩條有序鏈的合併,合併之後依然有序
void display(pnode head); //顯示函式
void destroylist(pnode*head); //釋放空間
#endif //
函式(linklist.c)
#include"linklist.h"
void initlinklist(pnode *head) //初始化函式
void pushfront(pnode*head, datatype d) //頭部插入資料函式
void popfront(pnode*head) //頭部刪除資料函式
}void pushback(pnode *head,datatype d) //尾部插入資料函式
else
pur->next = p; }}
void popback(pnode *head) //尾部刪除資料函式
if (pur!= null)
else }
void insert(pnode*head,datatype d,int pos) //指定位置插入函式
if (pos == 1)
else
p->next = cur;
pur->next = p; }}
void reverse(pnode*head) //逆序函式
*head = newhead;
}void reverseshow(pnode head) //逆序列印函式
void delnottail(pnode pos) //刪除無頭的非尾節點
}pnode find(pnode head,datatype d) //查詢函式
return null;
}pnode findmidnode(pnode plist) //查詢中間節點函式
return slow;
}pnode checkcycle(pnode plist) //判斷鍊錶是否帶環
} return null;
}int getcirclelength(pnode meet) //測量環的長度
}pnode getcircleentrynode(pnode meet, pnode plist) //查詢環的進入點
while (fast != slow)
return slow;
}pnode getnode(pnode plist1, pnode plist2,int k) //checkcross函式的子函式
while (fast != slow)
return slow;
}pnode checkcross(pnode p1, pnode p2) //判斷兩條鏈是否相交,若相交返回交點位置
while (plist2 != null)
if (plist1 != plist2)
return null;
if ((count1 - count2) > 0)
else }
void josephcycle(pnode plist, int k) //約瑟夫環
pur = cur->next;
cur->next = pur->next;
printf("%d ", pur->data);
free(pur);
cur = cur->next;
} printf("%d ", cur->data);
}void delknode(pnode plist, int k) //刪除倒數第k個節點
if (k == 0)
k = k%len;
if (k ==0)
while (fast->next!=null)
else
}cur = slow->next;
slow->next = cur->next;
free(cur);
}pnode merge(pnode plist1, pnode plist2) //合併兩條有序鍊錶
plist1->next = ret2;
sortlist(ret1);
return ret1;
}void sortlist(pnode head) //排序
cur = cur->next;
ret = cur;
} tail = ret;
cur = head; }}
void display(pnode head) //顯示函式
printf("over\n");
}void destroylist(pnode*head) //釋放空間函式
*head = null;
}
測試函式(test.c)
#include"linklist.h"
void test1()
void test2()
void test3()
void test4() //逆序
test5()
test6()
test7()
void test8()
destroylist(&head);
}void test9()
void test10()
void test11()
else
printf("yes\n");
}void test12()
void test13()
else }
void test14()
else
display(p1);
display(p2);
}void test15()
find(p1, 41)->next = find(p1, 1);
p2 = find(p1, 1);
josephcycle(p2, 3);
}int main()
面試題 鍊錶的 部分 翻轉
2016年08月09日 21 43 37 問題 給出乙個單鏈表 不帶頭節點 和乙個數k,請翻轉此單鏈表?例如 1 2 3 4 5 k 0 翻轉過後 1 2 3 4 5 1 2 3 4 5 k 2 翻轉過後 2 1 4 3 5 1 2 3 4 5 k 10 翻轉過後 5 4 3 2 1 在討論鍊錶的 ...
鍊錶 鍊錶常見筆試題和面試題 C語言
本文為鍊錶常見的筆試題和面試題,包含鍊錶反轉 判斷鍊錶是否有環 查詢環形入口 查詢公共結點 合併兩個有序鍊錶 查詢倒數第k個結點 查詢中間結點 刪除有序鍊錶重複結點。node list reverse node head node p head node q head next node r q n...
鍊錶的面試題
1 比較順序表和煉表的優缺點,它們分別在什麼場景下使用?1 順序表支援隨機訪問,單鏈表不支援隨機訪問。2 順序表插入 刪除資料效率很低,時間複雜度為o n 除尾插和尾刪 單鏈表插入 刪除效率更高,時間複雜度為o 1 3 順序表的cpu高速緩衝效率更高,單鏈表cpu高速緩衝效率低。2 列印單向鍊錶 v...