- add_two_numbers_lists
解釋:2個鏈表相加計算數值,比如5+11 = 16,感覺沒啥用。 - cloneListWithRandomPtr
解釋:鏈表中有一個隨機指針,如何克隆這樣的鏈表,主要分爲2步,第1步把原來的鏈表通過插入新的鏈節的方法複製一倍,然後把加長的鏈表分離2個鏈表,實現克隆的目的。
形象如下:
List in format (Node data, Random Node data) :
(1, 3)–>(2, 1)–>(3, 5)–>(4, 3)–>(5, 2)–>NULL
List in format (Node data, Random Node data) :
(1, 3)–>(1, 3)–>(2, 1)–>(2, 1)–>(3, 5)–>(3, 5)–>(4, 3)–>(4, 3)–>(5, 2)–>(5, 2)–>NULL - deleteLinkedlist
解釋:就是按規則刪除鏈表,暫無。 - deleteNode
解釋:常規操作,把指針指向下一個鏈表節點。然後刪除當前的節點。 - findIntersectionPointOfLists
解釋:就是把一個鏈表的指針指向另一個指針,然後找到這兩個指針重合的位置。一般比較容易想的是比較指針的地址,其實比較長度就可以了,只需要比較1次。 - floyedCycleDetection
解釋:使用經典的佛羅伊的循環查找算法,找到循環開始的位置,方法比喻:A以B的2倍速度先跑,那麼A一定先進入循環,當A再次遇到B時,A比B多跑了一個循環,而如果這時候讓A從原點以同B一樣的速度開始走,B繼續走,則A與B再次相遇的點就是循環的起點。可以編寫算式驗證。比如x1+x2 =a; x1+x2+l = 2a ,即得x1+x2 = l(l爲一個循環的長度) - insertInASortedLinkedList
解釋:不難理解,就是比較大小後重排列。這個功能是插入時即排列。有點像sortedarray。 - listDemo
解釋:List封裝了鏈表,Vector封裝了數組,List和Vector最主要的區別在於vector使用連續內存存儲的,vector支持[]運算符,而List是以鏈表形式實現的,不支持[],Vector對於隨機訪問的速度很快,但是對於插入尤其是在頭部插入元素速度很慢,在尾部插入速度很快。List對於隨機訪問速度慢得多,因爲可能要遍歷整個鏈表才能做到,但是對於插入就快的多,不需要拷貝和移動數據,只要改變指針的指向就可以了。另外對於新添加的元素,vector有一套算法,而List可以任意加入。 - listPallindrome
解釋:使用了與 floyedCycleDetection差不多的策略,就是先平分鏈表,然後反轉鏈表,然後進行比較,如果有不同的data說明不是對稱鏈表。 - merge_sort
解釋:並歸排序,還沒有完全吸收代碼。 膜拜一下這個程序。實現了並歸排序,裏面最精華的部分就是moveNode,它的參數類型是* &,活了那麼久第一次見(自己low),來看下代碼,其他沒什麼就是並歸排序十大經典排序算法(動圖演示)
void moveNode( Node * & dstNode, Node * & srcNode )
{
if (srcNode == nullptr) {
return;
}
//srcNode的next賦值給nextNode
Node * nextNode = srcNode->next;
//把srcNode傳入dummy,記住這裏是dummy,下一步dstNode的地址和dummy就不一樣了,因爲這裏傳進來的參數是* &,既可以改變地址指向的值也可以改變地址
dstNode->next = srcNode;
//dstNode地址被改變
dstNode = srcNode;
//srcNode地址被改變,這裏nextNode沒有被delete,數量大了會不會有內存泄露啊!
srcNode = nextNode;
}
這裏*&的解釋C++中*和&同時使用是什麼意思?,其實這個&的作用就是引用,可以改變指針地址的值。
- nthToLastNode
解釋:查找倒數第幾個節點的位置。讀懂這個,實現的原理就不難了。 - printMiddleNode
解釋:沒啥,就是一快一慢的策略。 - rearrange_list
解釋:沒啥,如果有的話我覺得亮點在reverse函數,其實就是一步一步把頭節點分離出來,然後反過來輸出。
void reverse( Node * & head )
{
Node * nextNode = nullptr;
Node * newHead = nullptr;
Node * curr = head;
while( curr ) {
nextNode = curr->next;
curr->next = newHead;
newHead = curr;
curr = nextNode;
}
head = newHead;
}
- removeDuplicatesFromSortedList
解釋:當比較不相等時,把地址重新賦值到head-next中。 - reverseAlternateNodes
解釋:和merge_sort差不多。忘了*&的含義,還是我介紹的清楚。其他應該沒有什麼。 - reverseLinkedListlterAndRecurse
解釋:reverseIter比較好理解,reverseRecur使用嵌套的方式進行翻轉,單步調試大致明白,不好理解,不過也沒有什麼就是實現了翻轉。 - swapNodesWithoutSwappingData
解釋:通過交換節點實現,分別預處理出要交換節點的前後節點鏈表,然後經過一頓操作(待深入分析),實現節點交換。