anAlgoProbAday-linked_list_problems

  1. add_two_numbers_lists
    解釋:2個鏈表相加計算數值,比如5+11 = 16,感覺沒啥用。
  2. 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
  3. deleteLinkedlist
    解釋:就是按規則刪除鏈表,暫無。
  4. deleteNode
    解釋:常規操作,把指針指向下一個鏈表節點。然後刪除當前的節點。
  5. findIntersectionPointOfLists
    解釋:就是把一個鏈表的指針指向另一個指針,然後找到這兩個指針重合的位置。一般比較容易想的是比較指針的地址,其實比較長度就可以了,只需要比較1次。
  6. 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爲一個循環的長度)
  7. insertInASortedLinkedList
    解釋:不難理解,就是比較大小後重排列。這個功能是插入時即排列。有點像sortedarray。
  8. listDemo
    解釋:List封裝了鏈表,Vector封裝了數組,List和Vector最主要的區別在於vector使用連續內存存儲的,vector支持[]運算符,而List是以鏈表形式實現的,不支持[],Vector對於隨機訪問的速度很快,但是對於插入尤其是在頭部插入元素速度很慢,在尾部插入速度很快。List對於隨機訪問速度慢得多,因爲可能要遍歷整個鏈表才能做到,但是對於插入就快的多,不需要拷貝和移動數據,只要改變指針的指向就可以了。另外對於新添加的元素,vector有一套算法,而List可以任意加入。
  9. listPallindrome
    解釋:使用了與 floyedCycleDetection差不多的策略,就是先平分鏈表,然後反轉鏈表,然後進行比較,如果有不同的data說明不是對稱鏈表。
  10. 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++中*和&同時使用是什麼意思?,其實這個&的作用就是引用,可以改變指針地址的值。

  1. nthToLastNode
    解釋:查找倒數第幾個節點的位置。讀懂這個,實現的原理就不難了。
  2. printMiddleNode
    解釋:沒啥,就是一快一慢的策略。
  3. 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;
}
  1. removeDuplicatesFromSortedList
    解釋:當比較不相等時,把地址重新賦值到head-next中。
  2. reverseAlternateNodes
    解釋:和merge_sort差不多。忘了*&的含義,還是我介紹的清楚。其他應該沒有什麼。
  3. reverseLinkedListlterAndRecurse
    解釋:reverseIter比較好理解,reverseRecur使用嵌套的方式進行翻轉,單步調試大致明白,不好理解,不過也沒有什麼就是實現了翻轉。
  4. swapNodesWithoutSwappingData
    解釋:通過交換節點實現,分別預處理出要交換節點的前後節點鏈表,然後經過一頓操作(待深入分析),實現節點交換。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章