面試筆記 資料結構 單鏈表

2021-09-27 03:49:09 字數 2261 閱讀 9869

可以通過下面的**定義乙個單鏈表:

typedef

struct node lnode,

*linklist;

這裡使用typedef將結構體struct node定義為lnode型別,表示鍊錶中每個結點的型別為lnode,它等價於結構體型別struct node。另外,*linklist是指向lnode型別的指標型別,當定義乙個指向lnode型別資料的指標變數時,lnode *l與linklist l是等價的。

問題:有乙個非空單鏈表list,每個結點中存放乙個整型資料。指標q指向鍊錶中某乙個結點,編寫乙個函式dellink,刪除q指向的結點。

分析:要刪除單鏈表中的結點,最重要的是獲取其前驅結點的指標。但是本題只給出了要刪除的結點指標q,並不知道其前驅結點的指標,因此無法直接刪除q指向的結點。這裡需要通過乙個迴圈來遍歷鍊錶,找到q的前驅結點,完成刪除結點的操作。

**:

void

dellink

(linklist *list, linklist q)

else

if(r->next != nullptr)

}}

問題:

程式設計實現乙個按值有序(遞增)的整型單鏈表中插入乙個結點,要求插入後鍊錶仍然保持按值有序排列。

分析:關鍵是要找到插入結點的位置pos,並使用指標r指向它的前驅結點,然後再將新的結點插入r所指向的結點後面即可。

**:

void

insertinorder

(linklist *list,

int e)

else

p->next = q;

r->next = p;

}}

問題:

編寫乙個函式linklist mergelist(linklist list1,linklist2)實現將兩個有序的鍊錶list1和list2合併成乙個鍊錶,返回合併後鍊錶的頭指標。要求合併後的鍊錶依然按值有序,並且不能開闢額外的記憶體空間。

分析:所謂合併就是將多個原鍊錶的結點進行重新組合排列,重組成乙個新的鍊錶。

**:

linklist mergelist

(linklist list1, linklist list2)

else

while

(p != nullptr&&q != nullptr)

else

} r->next = p ? p : q;

return list3;

}

問題:

編寫乙個程式,實現單鏈表的逆置,原鍊錶的資料元素為(a1,a2,a3,…,a(n-1),an),鍊錶逆置後變為(an,a(n-1),…,a3,a2,a1)。要求不增加新的鍊錶結點空間。

分析:單鏈表的逆置也是乙個很經典的演算法,它是通過三個指向不同結點的指標完成鍊錶的逆置,在一起迴圈中,將它們分別指向連續的三個結點,並迴圈後移,新增指向的連線線。

**:

void

reverselinklist

(linklist *list)

*list = q;

}

p、q、r三個指標分別指向list中連續的三個結點,先後順序為r、q、p。其中,p始終作為向後遍歷的指標,q指向p向後移動之前的那個結點,r指向q向後移動之前的結點,然後將q->next指向r,即實現了反轉。

問題:編寫乙個程式,找出乙個單鏈表中倒數第k個元素,並返回該結點的指標。

分析:普通解法:首先遍歷整個鍊錶,求出鍊錶的長度n,然後計算出倒數第k個結點的位置,即n-k+1,再次遍歷鍊錶,找出第n-k+1,再次遍歷鍊錶,找出第n-k+1個結點,並返回其指標。該演算法的時間複雜度為o(n)。但還有更巧妙的演算法,只要遍歷一次就可以得到鍊錶中倒數第k個結點的指標。

可以設定兩個指標p和q。首先用指標p從鍊錶的第乙個結點開始遍歷鍊錶,當遍歷到第k個結點時,再用指標q指向鍊錶的第乙個結點。然後p和q同步向後移動,當p指向最後乙個結點時,指標q指向的那個結點就是倒數第k個結點。

**:

linklist findktolastelem

(linklist list,

int k)

if(i == k && p != nullptr)

else

while

(p->next != nullptr)

return q;

//q指向了倒數第k個結點,返回之

}

面試筆記 資料結構 雙向鍊錶

雙向鍊錶是單鏈表的一種改進。單鏈表只能順著指標方向找到結點的後續結點,而無法找到其前驅結點。為此發明了迴圈鍊錶,只要通過迴圈的指標後移,一定可以找到前驅節點。但是迴圈鍊錶操作起來時間複雜度比較高,需要迴圈遍歷整個鍊錶。對於那些需要經常沿兩個方向移動指標的鍊錶來說,雙向鍊錶更合適。與單鏈表不同,雙向鍊...

面試筆記 資料結構 佇列與棧

1.佇列 佇列只允許從它的一端插入資料 隊尾 而從另一端取出資料 隊頭 一般情況下,習慣使用鍊錶作為佇列的儲存結構 typedef struct qnodeqnode,queueptr typedef struct linkqueue 上述 定義了乙個完整的佇列。qnode是佇列的結點型別,然後定義...

面試筆記 資料庫

資料庫引擎 mysql常用的儲存引擎包括innodb和myisam以及memory引擎 innodb更適合處理大量的高併發的資料,因為其良好的事務日誌和故障恢復處理。資料庫的大小決定了故障的恢復時間的長短,這會比較快,但是myisam會需要幾個小時 需要外來鍵處理,那你就要選擇innodb,如果需要...