關(guān)于“php鏈表操作”的問(wèn)題,小編就整理了【2】個(gè)相關(guān)介紹“php鏈表操作”的解答:
怎么樣查找出鏈表的循環(huán)部分的第一個(gè)節(jié)點(diǎn)?有以下幾種方法:
1。
如果允許修改節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)的話(huà),那么就在每個(gè)節(jié)點(diǎn)上設(shè)置一個(gè)標(biāo)志位表示是否被訪(fǎng)問(wèn)過(guò)。這樣遍歷時(shí)遇到已訪(fǎng)問(wèn)節(jié)點(diǎn)即是循環(huán)的第一個(gè)節(jié)點(diǎn)。
2。如果不允許修改節(jié)點(diǎn),那么就在外部用一個(gè)hashmap記錄下所有的已訪(fǎng)問(wèn)節(jié)點(diǎn)。遍歷時(shí)先查找這個(gè)hashmap,節(jié)點(diǎn)不存在則加入,已存在則該節(jié)點(diǎn)就是循環(huán)的第一個(gè)節(jié)點(diǎn)。
以單鏈表為存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)直接插入排序的算法?排序,是數(shù)據(jù)結(jié)構(gòu)中重要的一部分。今天做單鏈表的直接插入排序和簡(jiǎn)單選擇排序。首先,先解決單鏈表的存儲(chǔ)結(jié)構(gòu)和創(chuàng)建單鏈表。單鏈表的結(jié)構(gòu):typedef struct list { int data; struct list * next; }list,*linklist; 單鏈表的創(chuàng)建(使用了引用,應(yīng)為在創(chuàng)建鏈表的時(shí)候,頭節(jié)點(diǎn)申請(qǐng)空間,頭結(jié)點(diǎn)地址有變化,可以改為指針的指針):void create(linklist &L,int n) { int i; linklist p; L = (linklist)malloc(sizeof(list)); L->next = NULL; for(i=0;i<n;i++) { p = (linklist)malloc(sizeof(list)); scanf("%d",&p->data); p->next = L->next; L->next = p; } }單鏈表的打?。簐oid show(linklist L) { linklist p; p = L->next; while(p) { printf("%d\t",p->data); p = p->next; } }--------------------------------俄是分界線(xiàn)------------------------------單鏈表的基本操作就已經(jīng)完事了,接下來(lái)先看看直接插入排序。直接插入排序是一個(gè)穩(wěn)定的排序,所謂穩(wěn)定的排序就是假如待排數(shù)中有兩個(gè)相同的數(shù)值,在排序后其先后關(guān)系保持不變。其時(shí)間復(fù)雜度平均為O( ),空間復(fù)雜度為O(1)。直接插入法的思想是:默認(rèn)首個(gè)數(shù)據(jù)是排序好的,在待排序表中拿出首個(gè)數(shù)據(jù)與 排序表進(jìn)行比較,改變指針的指向進(jìn)而進(jìn)行排序,直到全部有序(由于是單鏈表,所以不能從后往前比較,只能從前往后比較,這點(diǎn)與存儲(chǔ)結(jié)構(gòu)是數(shù)組的直接插入法不一樣)具體排序簡(jiǎn)析圖void insertsort(linklist L) { linklist p,q,pre; p = L->next->next; L->next->next = NULL; while(p) { q = p->next; pre = L; while(pre->next != NULL && pre->next->data < p->data) pre = pre->next; p->next = pre->next; pre->next = p; p = q; } }----------------------------------俄也是分界線(xiàn)--------------------------------看完直接插入排序,那簡(jiǎn)單選擇排序就更簡(jiǎn)單了。簡(jiǎn)單選擇排序也是穩(wěn)定的排序,其時(shí)間復(fù)雜度和空間復(fù)雜度和直接插入排序一樣。簡(jiǎn)單選擇排序思想:從頭到尾進(jìn)行掃描,找到最小的放在第一個(gè)位置,在從第二個(gè)位置進(jìn)行第二次掃描,找到最小的,放在第二個(gè)位置,依次掃描,直到全部有序。簡(jiǎn)單選擇排序簡(jiǎn)析圖簡(jiǎn)單選擇排序代碼:linklist min(linklist p) { int da; linklist temp=p; da = p->data; p = p->next; while(p) { if(p->data < da) { temp = p; da = p->data; } p = p->next; } return temp; } void selectsort(linklist L) { linklist p,q; q = p = L->next; while(q) { p = min(p); int temp = p->data; p->data = q->data; q->data = temp; q = q->next; p = q; } }----------------------------俄還是分界線(xiàn)-----------------------實(shí)驗(yàn)結(jié)果:默認(rèn)為輸入五個(gè)數(shù),顯示兩種排序的結(jié)果。實(shí)驗(yàn)結(jié)果-----------------------------俄真的是分界線(xiàn)---------------------------當(dāng)然了,這兩種排序算法時(shí)間復(fù)雜度還是挺高的,還有更快的排序算法,比如著名的快排,堆排,基排(多關(guān)鍵字排序),在今后的學(xué)習(xí)中會(huì)更新。至于存儲(chǔ)結(jié)構(gòu)是數(shù)組的,這兩個(gè)排序算法寫(xiě)著就更簡(jiǎn)單了,本次就不寫(xiě)了??炜荚嚵?,哈哈,緊張緊張。
到此,以上就是小編對(duì)于“php鏈表操作”的問(wèn)題就介紹到這了,希望介紹關(guān)于“php鏈表操作”的【2】點(diǎn)解答對(duì)大家有用。