計(jì)鏈表)
題目你可以選擇使用單鏈表或者雙鏈表設(shè)計(jì)并實(shí)現(xiàn)自己的鏈表。單鏈表中的節(jié)點(diǎn)應(yīng)該具備兩個屬性val和next。val是當(dāng)前節(jié)點(diǎn)的值next是指向下一個節(jié)點(diǎn)的指針/引用。如果是雙向鏈表則還需要屬性prev以指示鏈表中的上一個節(jié)點(diǎn)。假設(shè)鏈表中的所有節(jié)點(diǎn)下標(biāo)從 0 開始。實(shí)現(xiàn)MyLinkedList類MyLinkedList()初始化MyLinkedList對象。int get(int index)獲取鏈表中下標(biāo)為index的節(jié)點(diǎn)的值。如果下標(biāo)無效則返回-1。void addAtHead(int val)將一個值為val的節(jié)點(diǎn)插入到鏈表中第一個元素之前。在插入完成后新節(jié)點(diǎn)會成為鏈表的第一個節(jié)點(diǎn)。void addAtTail(int val)將一個值為val的節(jié)點(diǎn)追加到鏈表中作為鏈表的最后一個元素。void addAtIndex(int index, int val)將一個值為val的節(jié)點(diǎn)插入到鏈表中下標(biāo)為index的節(jié)點(diǎn)之前。如果index等于鏈表的長度那么該節(jié)點(diǎn)會被追加到鏈表的末尾。如果index比長度更大該節(jié)點(diǎn)將 不會插入 到鏈表中。void deleteAtIndex(int index)如果下標(biāo)有效則刪除鏈表中下標(biāo)為index的節(jié)點(diǎn)。這題就是實(shí)現(xiàn)鏈表的增刪改查也是夢回高中了本題也是沿用了虛擬頭節(jié)點(diǎn)其他的一切正常注意邊界即可。還是要熟練鏈表結(jié)構(gòu)體的寫法這樣才不會只會寫業(yè)務(wù)邏輯代碼class MyLinkedList { public: struct LinkedNode { int val; LinkedNode* next; LinkedNode(int val):val(val), next(nullptr){} }; LinkedNode* dummyHead; int size; MyLinkedList() { dummyHead new LinkedNode(0); // 定義一個虛擬頭結(jié)點(diǎn) size 0; } int get(int index) { if (index (size - 1) || index 0) return -1; LinkedNode* cur dummyHead - next; while (index--) { cur cur - next; } return cur-val; } void addAtHead(int val) { LinkedNode* head new LinkedNode(val); head - next dummyHead - next; dummyHead - next head; size; } void addAtTail(int val) { LinkedNode* newNode new LinkedNode(val); LinkedNode* cur dummyHead; //防止空鏈表死循環(huán) int length size; while (length--) { cur cur- next; } cur - next newNode; size; } void addAtIndex(int index, int val) { if (index size || index 0) return; LinkedNode* newNode new LinkedNode(val); LinkedNode* cur dummyHead; //防止空鏈表死循環(huán) int length index; while (length--) { cur cur- next; } newNode - next cur - next; cur - next newNode; size; } void deleteAtIndex(int index) { if (index (size - 1) || index 0) return; LinkedNode* cur dummyHead; while(index--) { cur cur - next; } cur - next cur - next -next; size--; } };