【資料結構——連結串列】連結串列00——連結串列知識點總結
阿新 • • 發佈:2019-01-23
連結串列是一種動態結構,建立連結串列時,無須知道連結串列長度,插入一個節點時,只需為新節點分配記憶體,然後調整指標。
1.單向連結串列定義
struct ListNode
{
int data;
ListNode *pNext;
};
2.連結串列插入節點
void InsertNode(ListNode** pHead,int data)//pHead頭指標 { ListNode* pNew = new ListNode(); pNew->data = data; pNew->pNext = NULL; if(*pHead == NULL) { *pHead = pNew;//連結串列為空時新插入一個節點後,節點就是連結串列的頭指標 } else { ListNode *pNode = *pHead;//遍歷指標 while(pNode->pNext != NULL) pNode = pNode->pNext;//不斷遍歷直到最後一個,然後插入 pNode->pNext = pNew; } }
3.連結串列刪除節點
連結串列記憶體不是連續的,所以找第i個節點時,需要從開頭遍歷。效率為O(n).以下為刪除連結串列中含有某值的節點void DeleteNode(ListNode** pHead,int data) { if(pHead == NULL || *pHead == NULL) return; ListNode* pToBeDelete = NULL;//初始化要刪除的節點 if((*pHead)->data == data)//頭指標就是要刪除的節點 { pToBeDelete = *pHead; *pHead = (*pHead)->pNext; } else { //如果節點不是尾節點,且節點的下個節點不是要刪除的節點,則往下遍歷 ListNode* pNode = *pHead; while(pNode->pNext != NULL && pNode->pNext->data != data) pNode = pNode->pNext; //如果下個節點是要刪除的,則pNode指向下下個節點 if(pNode->pNext != NULL && pNode->pNext->data == data) { pToBeDelete = pNode->pNext; pNode->pNext = pNode->pNext->pNext; } //刪節點釋放記憶體 if(pToBeDelete != NULL) { delete pToBeDelete; pToBeDelete = NULL; } } }
劍指offer
1.面試題5——從尾到頭列印連結串列
2.面試題13——在O(1)時間刪除連結串列節點
3.面試題15——連結串列倒數第k個節點
4.面試題16——反轉連結串列
5.面試題17——合併兩個排序的連結串列
6.面試題26——複雜連結串列的複製
7.面試題37——兩個連結串列的第一個公共節點
程式設計之美
8.3.4——從無頭單鏈表中刪除節點
july
9.79——連結串列排序的演算法
10.給單鏈表建環
11檢測單鏈表是否有環
12.約瑟夫環
13.雙向連結串列與二叉樹