鏈表的介紹(包括定義、直觀理解、優勢和示例)以及leetcode上一些鏈表相關算法題的思路。
目錄
正文部分:
-
爲什麼要用鏈表,定義鏈表的基礎是什麼。
-
鏈表的直觀理解
-
舉例 (用鏈表而不是用數組來存儲電影信息)
-
解析
-
繼續優化代碼
leetcode算法題-初級-鏈表
//刪除某一節點
node->val = node->next->val;
node->next = node->next->next;
//刪除節點
second->next=second->next->next;
ListNode *cur=head;
ListNode *pre=NULL;
while(cur){
ListNode *next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
- 合併兩個有序鏈表
//應用遞歸
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//*** 特殊情況討論省略 ***
if( l1->val < l2->val){
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else{
l2->next = mergeTwoLists(l2->next, l1);
return l2;
}
}
- 迴文鏈表
//快慢指針法找到中點,中點後反轉鏈表
ListNode* fast = head;
ListNode* slow = head;
ListNode* prev = nullptr;
//find mid one
while(fast){
slow = slow->next;
fast = fast->next? fast->next->next: fast->next;//fast->next 爲空的時候就沒有fast->next->next了。
}
//reverse 操作和上文反轉鏈表一致
//***省略
//依舊是快慢指針法,如果是環形鏈表,指針終將指到同一位置。
while (fast->next && fast->next->next) {
slow=slow->next;
fast=fast->next->next;
if(slow==fast){
return true;
}
最後,補充閱讀材料,本文不再贅述:一個非常全面的帶有應用的總結 Linked List的複習總結-from:簡書dol_re_mi
參考資料:c primer 17章 從數組到鏈表 || leetcode習題