先給出定義部分和相關除錯部分
#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的...