限制長度雙向鍊錶的插入操作

2021-09-28 16:32:21 字數 1228 閱讀 5585

面試遇到的問題,一開始面試官是問我有什麼方案可以實現排行榜,當時給出了兩個方案。後面面試官又在我的其中一種方案上讓我手寫**實現排序雙線鍊錶的插入,根據score值插入,並且鍊錶長度限制在100。

需要考慮的點:1)插入在煉表表頭的;2)插入到煉表表尾;3)插入到鍊錶中間;4)需要在遍歷整個鍊錶的時候統計鍊錶的長度;5)如果長度剛好在100而插入剛好在末尾,則此時不需要執行插入操作。完整**如下

#include using namespace std;

#define max_rank 100

struct link

};link* initlink(int n)

int i = n;

link *head = new link;

head->score = i * 2;

link *node = head;

while (i > 1)

return head;

}void freelink(link *l)

}link* insertlinklimit(link* l, int score)

int cnt = 1;

link *head = l, *tmp = l->next;

if (l->score <= score)

else

if (tmp == null && cnt == max_rank)

// 其他情況執行插入操作

// 1)在鍊錶中間

// 2)在鍊錶末尾但是插入後長度沒有超過限制

l->next = new link;

l->next->score = score;

l->next->next = tmp;

l->next->prev = l;

if (tmp)

l = l->next;

cnt++;

} // 因為需要統計長度,所以執行插入操作後還需要遍歷鍊錶

while (tmp && cnt < max_rank)

// 如果插入後操作長度限制,則需要刪除最後乙個節點。

if (tmp)

cout << cnt << endl;

return head;

}void printlink(link* l)

cout << endl;

}int main()

簡單的測試了幾種情況,輸出都是對的。

雙向鍊錶插入 刪除操作

雙向鍊錶 迴圈單鏈表的出現,雖然能夠實現從任一結點出發沿著鏈能找到其前驅結點,但時間耗費是o n 如果希望從表中快速確定某乙個結點的前驅,另乙個解決方法就是在單鏈表的每個結點裡再增加乙個指向其前驅的指標域prior。這樣形成的鍊錶中就有兩條方向不同的鏈,我們可稱之為雙 向 鍊錶 doublelink...

雙向鍊錶的插入

問題 給定乙個已排序的雙向鍊錶,向其中插入乙個元素。solution struct listnode int insert listnode head,int value listnode newnode new listnode newnode val value newnode next nex...

雙向鍊錶的操作

include using namespace std 列印選項 void printtheselect typedef struct dulnode dulnode,dulinklist 初始化雙向鍊錶 void initdlist dulinklist l cout 雙向鍊錶構造完畢 n 列印雙...