鏈表面試題

2021-08-02 18:29:37 字數 2259 閱讀 8958

//不改變鍊錶結構,從尾到頭列印單鏈表 (遞迴實現)

void printlistrevers_recursively(plist phead)

printf("%d ", phead->

data);}}

當鍊表非常長的時候,遞迴實現的會導致函式呼叫層級很深,可能導致呼叫棧溢位。用棧不會出現此類情況,顯然用棧實現**的魯棒性會好一些。

//不改變鍊錶結構,從尾到頭列印單鏈表(棧實現) 

void

printlistrevers_stack

(plist phead)

while (!nodes.empty())

}

void deletenottailnode(pnode pos)

void insertnotheadnode(pnode pos, datatype d)

//逆置鍊錶

常用排序演算法時間複雜度和空間複雜度

氣泡排序的最壞時間複雜度為o(n^2)

//氣泡排序

void bubblesort(plist* pplist)}}

}

快速排序是在實際中最常用的一種排序演算法,速度快,效率高。就像名字一樣,快速排序是最優秀的一種排序演算法。

快速排序採用的思想是分治思想。

先從數列中取出乙個數作為基準數。

分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

再對左右區間重複第二步,直到各區間只有乙個數。

儘管快速排序的最壞時間為o(n2),但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快者,快速排序亦因此而得名。它的平均時間複雜度為o(nlgn)。

//快速排序

void quicksort(pnode begin, pnode end)

fast = fast->next;

}datatype tmp1 = slow->

data;

slow->

data = begin->

data;

begin->

data = tmp1;

quicksort(begin, slow);

quicksort(slow->next, end);}}

選擇排序的最壞時間複雜度為o(n^2)。

兩個元素乙個走外層pnode out乙個走內層pnode in,內層元素與外層元素比較大小。內層先遍歷,如果公升序排列,遇到小的元素則將小的的值交換到外層元素,內層走完一遍後,最小的已經在最前面了,然後外層走向下乙個元素,內層繼續從外層的下乙個元素開始遍歷重複之前動作,直至外層也遍歷完成,整個排序結束。選擇排序是不穩定的排序 方法(比如序列[5, 5, 3]第一次就將第乙個[5]與[3]交換,導致第乙個5挪動到第二個5後面)。

//選擇排序

void selectionsort(plist plist)}}

}

plist merge(plist list1, plist list2)

else

return

newlist;

}

pnode findmiddlenode(plist list)

return slow;

}

//findkthtotail

pnode findkthtotail(plist list, unsigned int k)

cur = list;

while (prev->next)

return cur;

}

//test find middle/find k

void testfind()

printf

("\n");

}

鏈表面試題

從尾到頭列印單鏈表 棧 遞迴 從尾到頭列印鍊錶 includevoid printtailtohead listnode head while s.empty 空間複雜度o n void printtailtoheadr listnode head cout data 刪除乙個無頭單鏈表的非尾結點 ...

鏈表面試題

typedef int datatype typedef struct node node,pnode,plist void initlist plist pplist void display const plist plist void pushback plist pplist,datatyp...

鏈表面試題

pragma once include typedef int datetype typedef struct listnode listnode 單鏈表實現約瑟夫環 listnode josephcycle listnode first,int k tail next first listnode...