1. 程式人生 > >【資料結構——連結串列】連結串列00——連結串列知識點總結

【資料結構——連結串列】連結串列00——連結串列知識點總結

連結串列是一種動態結構,建立連結串列時,無須知道連結串列長度,插入一個節點時,只需為新節點分配記憶體,然後調整指標。

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.雙向連結串列與二叉樹