鍊錶複習題

2021-08-04 15:44:44 字數 4440 閱讀 7198

c或者c++實現下面的題目並測試:

1. 比較順序表和煉表的優缺點,說說它們分別在什麼場景下使用?

2. 從尾到頭列印單鏈表

3. 刪除乙個無頭單鏈表的非尾節點

4. 在無頭單鏈表的乙個節點前插入乙個節點

5. 單鏈表實現約瑟夫環

6. 逆置/反轉單鏈表

7. 單鏈表排序(氣泡排序&快速排序)

8. 合併兩個有序鍊錶,合併後依然有序

9. 查詢單鏈表的中間節點,要求只能遍歷一次鍊錶

10. 查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶

長度固定,必須在分配記憶體之前確定陣列的長度。

儲存空間連續,即允許元素的隨機訪問。

儲存密度大,記憶體中儲存的全部是資料元素。

要訪問特定元素,可以使用索引訪問,時間複雜度為 o(1)o(1)。

要想在順序表中插入或刪除乙個元素,都涉及到之後所有元素的移動,因此時間複雜度為 o(n)o(n)。

順序表最主要的問題就是要求長度是固定的,可以使用倍增-複製的辦法來支援動態擴容,將順序表變成「可變長度」的。

具體做法是初始情況使用乙個初始容量(可以指定)的陣列,當元素個數超過陣列的長度時,就重新申請乙個長度為原先二倍的陣列,並將舊的資料複製過去,這樣就可以有新的空間來存放元素了。這樣,列表看起來就是可變長度的。

二、鍊錶

鍊錶,類似它的名字,表中的每個節點都儲存有指向下乙個節點的指標,所有節點串成一條鏈。根據指標的不同,還有單鏈表、雙鏈表和迴圈鍊錶的區分,如圖 2 所示。

單鏈表是只包含指向下乙個節點的指標,只能單向遍歷。

雙鏈錶即包含指向下乙個節點的指標,也包含指向前乙個節點的指標,因此可以雙向遍歷。

迴圈單鏈表則是將尾節點與首節點鏈結起來,形成了乙個環狀結構,在某些情況下會非常有用。

還有迴圈雙鏈表,與迴圈單鏈表類似,這裡就不再贅述。

由於鍊錶是使用指標將節點連起來,因此無需使用連續的空間,它具有以下特點:

長度不固定,可以任意增刪。

儲存空間不連續,資料元素之間使用指標相連,每個資料元素只能訪問周圍的乙個元素(根據單鏈表還是雙鏈表有所不同)。

儲存密度小,因為每個資料元素,都需要額外儲存乙個指向下一元素的指標(雙鏈表則需要兩個指標)。

要訪問特定元素,只能從煉表頭開始,遍歷到該元素,時間複雜度為 o(n)o(n)。

在特定的資料元素之後插入或刪除元素,不涉及到其他元素的移動,因此時間複雜度為 o(1)o(1)。雙鏈表還允許在特定的資料元素之前插入或刪除元素

用棧模擬輸出

#include 

#include

#include

using

namespace

std;

// 除錯開關

#define __tmain main

#ifdef __tmain

#define dout cout

#else

#define dout 0 && cout

#endif // __tmain

#ifdef __tmain

struct listnode

*/};

#endif // __tmain

/*** struct listnode

* };

*/class solution

// 為了效率我們靜態vector開闢空間

vector

res(count);

dout <<"count = "

return res;

}};int __tmain( )

void printlistformtailtohead(pnode phead)  

else

} void deletenottailnode(pnode pos)//刪除乙個無頭單鏈表的非尾節點

pnode buy_node(datatype data)//建立節點!!!

tmp->

data

=data;

tmp->pnext =

null;

return tmp;

}void insertnotheadnode(pnode pos, datatype data)

#include 

#include

#include

typedef struct stu

node,*linklist;

void kong(linklist &l)

void creat(linklist &l,int n)

r->next=null;

}void huan(linklist &l,int n,int

m) else

else

}p=l->next;

for(j=1;j<=n;j++)

p=l->next;

g=l->next;

x=f=1;

p1=l;

}else

}}void main()

typedef

int datatype;

typedef

struct strnode

node;

typedef

struct strnode* pnode;

pnode reversenode(pnode phead)// 逆置 / 反轉單鏈表

pcurrent = phead;

while (pcurrent != null)

if (pcurrent == null) // 注意把最後乙個節點別忘了反轉!!

}

void bubblesort(int a, int n) 

} }

}void print(int a, int n)

cout

int partition(int a, int low, int high)

print(a,10);

return low;

} void qsort_improve(int r[ ],int low,int high, int k)

}

void quicksort(int r, int n, int k)

r[j+1] = tmp;

}

}

int main();

cout

<<"初始值:";

print(a,10);

quicksort(a,9,4);

cout

<<"結果:";

print(a,10);

}

"font-family:microsoft yahei;"

>

void bubble_pnode(pnode phead)

p1 = phead;

while (p1 !=

null)

p2 = p2->pnext;

} p1 = p1->pnext;

} }

"font-family:microsoft yahei;"

>pnode merge_node(pnode phead1, pnode phead2)//合併兩個有序鍊錶

ph1->pnext = ph2;

pphead = phead1;

bubble_pnode(pphead);

return pphead;

}

slistnode * findmidnode(slistnode * phead)  

else

slow = slow->next;

} return slow;

} 也可以這樣寫,更為簡潔

while (fast&&fast->next )

#include 

#include

using

namespace

std;

typedef

struct listnode listnode,*node;

int main()

node p=head;

node q=head;

int i=1;

while(p!=null)

else

}cout

<<"the data is: "

}

SAM複習題表

今天重新學了一下sam 那麼一些題目肯定是少不了的 在這裡記錄一下吧,可能沒什麼啟發的題就不寫了 題意 多個串的最長公共子串 題解 對於乙個建立sam,然後對於剩下的所有點在上面跑,對於每乙個點的狀態取最小值。但是這樣是不夠的,你還要跳一次fail來進行更新,這個的話拓撲更新就可以了 題意 求第k大...

鍊錶課後複習題 王道

目錄 1.設計乙個遞迴演算法,刪除不帶頭結點的單鏈表l中所有值為x的結點。2.刪除帶頭結點的單鏈表l中所有值為x的結點。3.在帶頭結點的單鏈表l中從尾到頭反向輸出每個結點的值 4.帶頭結點單鏈表l中刪除乙個最小值結點的比較高效的演算法,假設最小值結點唯一 5.將帶頭結點的鍊錶就地逆置 明日繼續更 以...

檔案複習題

1.把乙個數字的list從小到大排序,然後寫入檔案,然後從檔案中讀取出來檔案內容,然後反序,在追加到檔案的下一行中 首先 將list 排序,其次寫入檔案 l 10,8 3,2 6,0 1,9 5,4 l1 sorted l f codecs.open 2.txt wb f.write str l1 ...