1. 程式人生 > >在O(1)時間內刪除連結串列節點

在O(1)時間內刪除連結串列節點

#include<iostream>
using namespace std;

struct ListNode
{
	int data;
	ListNode* pNext;
};

//構造連結串列
ListNode* InsertNode(ListNode* &pHead,int data)
{
	ListNode* pNew = new ListNode();
	pNew->data = data;
	pNew->pNext = NULL;

	if(NULL == pHead)
	{
		pHead = pNew;
	}
	else
	{
		ListNode* pNode = pHead;
		while(pNode->pNext != NULL)
			pNode = pNode->pNext;
			pNode->pNext = pNew;
	}
	return pNew;
}

//刪除指定節點
void DeleteNode(ListNode* &pHead,ListNode* pToBeDeleted)
{
	if(!pHead || !pToBeDeleted)
		return;
	
	//先判斷是不是尾節點
	if(pToBeDeleted->pNext != NULL)
	{
		ListNode* pNextOne = pToBeDeleted->pNext;//複製下個節點
		pToBeDeleted->data = pNextOne->data;//把下個節點賦值給要刪除的節點
		pToBeDeleted->pNext = pNextOne->pNext;//要刪除的節點直接指向下下個,然後刪除下個節點

		delete pNextOne;
		pNextOne = NULL;
	}
	//連結串列只有一個節點
	else if(pHead == pToBeDeleted)
	{
			delete pToBeDeleted;
			pToBeDeleted = NULL;
			pHead = NULL;
	}
	//是尾節點,需要從頭遍歷
	else
	{
		ListNode* pNode = pHead;
		while(pNode->pNext != pToBeDeleted)
			pNode = pNode->pNext;
	
		pNode->pNext = NULL;
		delete pToBeDeleted;
		pToBeDeleted = NULL;
	}
}

//輸出連結串列
void PrintList(ListNode* &pHead)
{
	if(NULL == pHead)
		return;
	ListNode* pNode = pHead;
	while (NULL != pNode)
	{
		cout << pNode->data << " ";
		pNode = pNode->pNext;
	}
	cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
	int num = 0;
	ListNode* pHead = NULL;
	ListNode* pToBeDeleted = NULL;

	ListNode* pNode1 = InsertNode(pHead,1);
    ListNode* pNode2 = InsertNode(pHead,3);
    ListNode* pNode3 = InsertNode(pHead,5);
    ListNode* pNode4 = InsertNode(pHead,7);
    ListNode* pNode5 = InsertNode(pHead,9);

	cout << "輸出原來的連結串列:" << endl;
	PrintList(pHead);
	DeleteNode(pHead,pNode3);
	cout << "輸出刪除節點3後的連結串列:" << endl;
	PrintList(pHead);
	system("pause");
	return 0;
}