準備 演算法和資料結構(一 鍊錶及其翻轉)

2021-08-26 05:15:19 字數 3969 閱讀 1076

鍊錶

鍊錶應該是面試時被提及的最頻繁的資料結構。鍊錶是由指標把若干個結點連線成鏈狀結構。鍊錶的建立,插入結點,刪除結點等操作都只需要20行左右的**就能實現,比較適合面試。

題目:輸入乙個鍊錶的頭結點,從尾到頭 反過來列印出每個結點的值。要求不改變鍊錶的結構。

思路:

通過遞迴來實現反過來輸出鍊錶,當訪問到乙個結點的時候,先遞迴輸出它後面的結點,在輸出結點本身,這樣就可以輸出反過來的鍊錶了

單鏈表:

#define _crt_secure_no_warnings 

#include

using

namespace

std;

//單鏈表結點翻轉 - 遞迴

typedef

struct listnode listnode;

#define listsize 1000

listnode listnodepool[listsize];//建立結點池,在需要的時候直接獲取,比new listnode時間快

int nodenum = 0;

//nil是表頭,nil是它的指標,繫結一下

listnode nil;

listnode * nil;

listnode * getnewnode()

void listinit()

//dstnode是乙個指向指標的指標,,如果插入的鍊錶是乙個空鍊錶的時候,新插入的結點就是鍊錶的頭指標,這時會

//改變頭指標,因此必須吧dstnode引數設定為指向指標的指標,否則在這個函式範圍外,dstnode 仍然是乙個空指標。

void singlelistinsterafter(listnode ** dstnode, listnode * newnode)

else

tempnode->next = newnode;

}}int data[listsize];

void showlist()

printf("\n");

}void printlistreversingling_recursively(listnode * phead)

printf("%d ", phead->key);

}}void main()

printf("\n");

listinit();

for (int i = 0; i < n; i++)

//按照插入的順序輸出

showlist();

//翻轉單鏈表

listnode * phead = nil;

printlistreversingling_recursively(phead->next);

}

雙鏈表:
#define _crt_secure_no_warnings 

#include

using

namespace

std;

//linkedlist api

//雙鏈表結點 從尾到頭列印鍊錶

typedef

struct listnode listnode;

#define listsize 1000

listnode listnodepool[listsize];//建立結點池,在需要的時候直接獲取,比new listnode時間快

int nodenum = 0;

//nil是表頭,nil是它的指標,繫結一下

listnode nil;

listnode * nil;

listnode * getnewnode()

void listinit()

void listinsertafter(listnode * dstnode, listnode * newnode)

//end of linkedlist api

int data[listsize];

void showlist()

cout

<< endl;

}void printlistreversingling_recursively(listnode * phead)

printf("%d ", phead->key);

}}void main()

printf("\n");

listinit();

for (int i = 0; i < n; i++)

//按照插入的順序輸出

listnode * curnode = nil->next;

while (curnode != nil)

cout

<< endl;

listnode * phead = nil;

printlistreversingling_recursively(phead->next);

}

a. 建立:10個隨機的數字,將其插入到鍊錶中

b. 遍歷:將這10個數字按照插入順序輸出

c. 新增、刪除:使用插入排序的方法調整鍊錶節點的順序,使得節點按值的公升序排列

//linkedlist api

//雙向鍊錶結點

typedef

struct listnode listnode;

#define listsize 1000

listnode listnodepool[listsize];//建立結點池,在需要的時候直接獲取,比new listnode時間快

int nodenum = 0;

//nil是表頭,nil是它的指標,繫結一下

listnode nil;

listnode * nil;

listnode * getnewnode()

void listinit()

void listinsertafter(listnode * dstnode, listnode * newnode)

void listinsertatfront(listnode * node)

void listdelete(listnode * node)

listnode * listsearch(int k)

return x;

}//end of linkedlist api

int data[listsize];

void insertsort(int data, int n)

else

}data[j + 1] = key;

}}void showdata(int n)

cout

<< endl;

}void showlist()

cout

<< endl;

}void listinsertsort()

dstnode = dstnode->prev;

tmpnode = curnode->next;

listdelete(curnode);

listinsertafter(dstnode, curnode);

curnode = tmpnode;

}}void main()

//cout << endl;

printf("\n");

listinit();

listnode * dstnode = nil;

for (int i = 0; i < n; i++)

//按照插入的順序輸出

listnode * curnode = nil->next;

while (curnode != nil)

cout

<< endl;

//插入按照從小到大排序輸出,陣列實現

insertsort(data, n);

showdata(n);

//插入按照從小到大排序輸出,鍊錶實現

listinsertsort();

showlist();

}

面試準備 資料結構 鍊錶

include using namespace std 鍊錶節點定義 template struct slnode slnode const t item,slnode nextnode null 鍊錶類定義 templateclass sllist sllist bool isempty int ...

資料結構 比較鍊錶和陣列

計算機的資源是有限的 而人對計算機的需求是無限的 好的資料機構和演算法便是為了更好的滿足計算機使用者的需求 而這也是計算機作業系統意義所在。在學習資料結構的同時 了解一定的計算機作業系統知識有助於更好的理解其意義所在。而了解資料結構和演算法 會更容易明白作業系統的工作原理。廣義上講 資料結構是資料的...

資料結構與演算法 一 鍊錶

鍊錶的分類 迴圈鍊錶 雙向鍊錶演算法 結構記憶體塊 鍊錶的結點 後繼指標next 指向下乙個結點 頭結點鍊錶中第乙個結點,其記錄鍊錶中的基位址 尾結點鍊錶中的最後乙個結點,其next指標指向null 時間複雜度 刪除和插入 都只需要改變相鄰結點的next指標指向即可,時間複雜度為o 1 隨機訪問 不...