面試 資料結構

2021-07-10 13:11:39 字數 3332 閱讀 6547

先給出定義部分和相關除錯部分

#include

.h>

using namespace std;

struct listnode

*head;

listnode* insert(int v)

while(p->next!=

null)

p = p->next;

p -> next =

new listnode;

p = p ->next;

p->next =

null;

p -> v =v;

return p;

}void show()

通過三個指標實現.

listnode*rev(listnode *head)

return p;

}

除錯與驗證

void showrev()

定義兩個指標,乙個一次走兩個,另乙個一次走乙個. 如果有環就會相遇

bool hasloop(listnode *head)

return

0;}

除錯與驗證

void showhasloop1()

void showhasloop2()

void showhasloop3()

先判環,如果有環,那麼就乙個指標移動,另乙個不動,作為標記.

int circlelen(listnode *head)

break;}}

return cnt;

}

驗證

void showcirclelen1()

void showcirclelen2()

void showcirclelen3()

還是定義兩個指標,p1指標先走環長個節點,然後p1和p2步進,再次相遇的時候p2走的步數就是鏈長.需要注意的是沒有環的情況.

int linklen(listnode *head)

for(ret = 0;p1 != p2 || (null != p1 && len == 0); ret++ )

return ret;

}

驗證

void showlinklen1()

void showlinklen2()

void showlinklen3()

#include

.h>

using namespace std;

struct listnode

*head;

listnode* insert(int v)

while(p->next!=

null)

p = p->next;

p -> next =

new listnode;

p = p ->next;

p->next =

null;

p -> v =v;

return p;

}void show()

listnode*rev(listnode *head)

return p;

}void showrev()

bool hasloop(listnode *head)

return0;}

void showhasloop1()

void showhasloop2()

void showhasloop3()

int circlelen(listnode *head)

break;}}

return cnt;

}void showcirclelen1()

void showcirclelen2()

void showcirclelen3()

int linklen(listnode *head)

for(ret =

0;p1 != p2 || (null

!= p1 && len ==

0); ret++ )

return ret;

}void showlinklen1()

void showlinklen2()

void showlinklen3()

int main()

定義和性質:

(以下例子使用大根堆)

按倒序掃一遍父節點

對於每個父節點找到最大的乙個子節點,若該節點嚴格大於父節點,則交換父子的值,再對該節點遞迴的進行第二步,直到沒有子節點大於父節點,此時繼續執行第一步.

思考:當我們執行第 2 步的時候,我們就是在維護這個子堆的性質.假如 子堆a 滿足性質,那麼這個 子堆a 的 父節點b 一定能在少於 logn 次交換後,使子堆 a∪b 滿足堆的性質.

把要插入的數當成堆的最後乙個元素,要維護堆把該節點與父節點進行交換,遞迴執行,直到滿足堆的性質(該節點嚴格小於父節點)

大根堆規定只能刪除最大元素,也就是頭結點.步驟如下:

移除頭結點

將最後乙個節點換到頭部(**中是 1,2 步結合,將頭結點與最後乙個節點置換,然後長度 -1 )

執行建立時第 2 步操作,維護堆的性質

利用大根堆的性質,每次可以刪除最大的元素,我們把這個元素放在佇列最後不去考慮他,遞迴執行找第 n-i 大的元素放在佇列尾部.這樣就形成了乙個非遞減數列.

#include 

using

namespace

std;

const

int maxn = 1e5;

///bigroot

struct heap

int getls(int num)

int getrs(int num)

int getf(int num)

void _fixdown(int num)

else

break;}}

void build()

void insert(int v)

}void remove()

void sort()

}h;char hit[10000];

int offset = 0;

void pt(char *s)

int at = ;

int main()

}return

0;}

資料結構 面試

看了劍指offer發現乙個問題有好多種思路去解決,之前自己考慮的都太普遍性,應當多樣化的來思考問題 最深體會 寫出實現功能的 和寫出優異的 是兩回事!1.鍊錶的倒敘列印 1 是否可以改變鍊錶結構,可以改變就改變以後列印 2 不允許改變鍊錶結構可以直接使用迴圈,但是時間複雜度會是o n 3 使用棧來儲...

《面試》資料結構 python

思想 只限定在資料棧的一端 棧頂 進行元素的操作,是一種特殊的線性表。操作例項 二進位制轉換十進位制 class structure object deftwooten self,l m i len l while i 0 n l i 1 pow 2,len l i i i 1 print sum ...

2019 面試 資料結構

二叉樹是資料結構中一種重要的資料結構,也是樹表家族最為基礎的結構。二叉樹的定義 二叉樹的每個結點至多只有二棵子樹 不存在度大於2的結點 二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2i 1個結點 深度為k的二叉樹至多有2k 1個結點 對任何一棵二叉樹t,如果其終端結點數為n0,度為2的...