鍊錶的面試題總結
鍊錶在面試中是非常容易的考點,所以在這裡總結一下,希望對大家有所幫助
首先,我們給出鍊錶的基本結構,和基本的操作,建立乙個結點,列印鍊錶的結點,尾插法加入結點。
#include #include #include typedef int datatype;
typedef struct slistnodeslistnode;
slistnode* buyslistnode(datatype x); //
void slistprint(slistnode* phead); //
void slistpushback(slistnode** pphead, datatype x);
slistnode* buyslistnode(datatype x)
void slistprint(slistnode* phead)
else
printf("\n"); }}
void slistpushback(slistnode** pphead, datatype x)
else
pcur->_pnext = newnode; }}
int main()
此時我們就建立好乙個鍊錶,鍊錶的內容為:1 2 3 4 5
①從尾到頭列印鍊錶
方法中我們定義乙個tail指標,每次把tail指標當作結尾的標緻向前移動,然後遍歷鍊錶列印尾結點
void printlisttailtohead(slistnode* phead)
printf("%d ",cur->_pdata);
tail = cur;
}}
②刪除無頭單鏈表的非尾結點(不能遍歷)
我們使用替換法刪除結點,用next指標標記pos的下乙個結點,用next->data覆蓋pos->data,然後把next釋放,邏輯上pos指的結點就被刪除了
slistnode* find(slistnode* phead,datatype x)
return null;
}void deletenottailnode(slistnode* pos)
③在無頭單鏈表的乙個結點前插入乙個結點(不能遍歷)
方法和之前的替換法相當,用後插法在結點的後面插入乙個值,用要插入的值改變pos的值,那麼在邏輯上就是在pos前面插入乙個值
void insertfrontnode(slistnode* pos,datatype x)
④約瑟夫環問題
每次按照傳入的引數,讓cur走相應的步數,然後按照替換法刪除在邏輯上刪除cur指的結點
slistnode* josephcircle(slistnode* phead,int k)
next = cur->_pnext;
cur->_pdata = next->_pdata;
cur->_pnext = next->_pnext;
free(next);
} return cur;
}
⑤單鏈表的逆置(不開闢新空間)
方法一:
函式中,我們用n1,n2,n3三個指標聯動跑,按照while迴圈裡面的順序,最後一次出來的時候n2,n3指的是空,n1指的是之前鍊錶的尾部,現在返回n1就是返回新鍊錶的頭指標
slistnode* reverselist(slistnode** pphead)
} return n1;
}
方法二:
slistnode* reverselist(slistnode** pphead)
return newlist;
}
⑥鍊錶的氣泡排序
void slistbubblesort(slistnode* phead)
cur = cur->_pnext;
next = next->_pnext;
} if(flag == 0)
tail = cur;
}}
⑦把兩個鍊錶合成乙個有序鍊錶
注意情況:兩個鍊錶有可能不一樣長,有可能為空
slistnode* slistmeget(slistnode** list1,slistnode** list2)
if((*list1)->_pdata < (*list2)->_pdata)
while (*list1 && *list2)//兩個鍊錶都沒結束的時候,做比較,把新鍊錶的tail->_pnext指向較小的鍊錶
else
tail = tail->_pnext;
} if(*list1)
if(*list2)
return list;
}
⑧找到鍊錶的中間鍊錶(只能遍歷一遍鍊錶)
函式中,使用乙個快指標fast,使用乙個慢指標slow,slow走一步,fast走兩步,那麼在fast走到結尾的時候,slow走了fast的一半,所以slow就走在鍊錶的中間
slistnode* findmidnode(slistnode* phead)
return slow;
}
⑨找到倒數第k個結點(只能遍歷一次鍊錶)
方法中首先讓快指標和慢指標相差k個位置,那麼在快指標到達尾結點的時候,慢指標就在倒數第k個結點
slistnode* findnodefrombackofnumberk(slistnode* phead,int k)
} while (fast)
return slow;
}
⑩判斷鍊錶是否帶環
fast指標一次走兩步,slow指標一次走一步,若帶環,那麼兩個指標在環裡面一定會相遇
}return null;} ⑪判斷環的大小,也就是環裡面有多少結點slistnode* iscircle(slistnode* phead)
我們使用之前判斷是否帶環的函式來確定指標在環裡面相遇的點,在按照這個點跑一圈,就是這個環的長度。
int circlelength(slistnode* phead)
return cnt;
}
⑫判斷環的入口點:
slistnode* enternode(slistnode* phead)
return cur;
}
判斷環的入口點講解圖:
面試題總結 鍊錶型別
單向鍊錶的定義如下 struct listnode 往該鍊錶的末尾新增乙個結點的c 如下 listnode addtail listnode phead,int value pnode m pnext pnew return phead 在鍊錶中找到第乙個含有某值的結點並刪除該結點 void rem...
鍊錶的演算法面試題總結
1 單鏈表的建立和遍歷 2 求單鏈表中節點的個數 太簡單,就不寫了 3 查詢單鏈表中的倒數第k個結點 劍指offer,題15 4 查詢單鏈表中的中間結點 5 合併兩個有序的單鏈表,合併之後的鍊錶依然有序 出現頻率高 劍指offer,題17 6 單鏈表的反轉 出現頻率最高 劍指offer,題16 7 ...
鍊錶的面試題
1 比較順序表和煉表的優缺點,它們分別在什麼場景下使用?1 順序表支援隨機訪問,單鏈表不支援隨機訪問。2 順序表插入 刪除資料效率很低,時間複雜度為o n 除尾插和尾刪 單鏈表插入 刪除效率更高,時間複雜度為o 1 3 順序表的cpu高速緩衝效率更高,單鏈表cpu高速緩衝效率低。2 列印單向鍊錶 v...