단일 체인 테이블 노드 삭제, 시간 복잡도 O(1)
1. 핵심 운영 코드는 다음과 같습니다.
struct ListNode
{
int m_data;
ListNode *m_pNext;
};
void DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted)
{
if(pListHead == NULL || pToBeDeleted == NULL)
return;
//=================================================
//
if(pToBeDeleted->m_pNext != nullptr)
{
ListNode *temp = pToBeDeleted->m_pNext;
pToBeDeleted->m_data = temp->m_data;
pToBeDeleted->m_pNext = temp->m_pNext;
delete temp;
temp = nullptr;
}
//=================================================
//
else if(pToBeDeleted == *pListHead)
{
delete pToBeDeleted;
pToBeDeleted = nullptr;
*pListHead = nullptr;
}
//
else
{
ListNode *cur = *pListHead;
while (cur->m_pNext != pToBeDeleted)
{
cur = cur->m_pNext;
}
delete pToBeDeleted;
pToBeDeleted = nullptr;
cur->m_pNext = nullptr;
}
}
2. 전체 테스트 구현 코드는 다음과 같습니다.
헤더 파일
#ifndef _HEAD_H_
#define _HEAD_H_
typedef int DataType;
class ListNode
{
public:
ListNode(const DataType & x):m_data(x), m_pNext(NULL){}
DataType m_data;
ListNode * m_pNext;
};
class Slist
{
public:
Slist():m_pHead(NULL), m_pTail(NULL)
{}
~Slist()
{
Destroy();
}
void Destroy()
{
ListNode *begin =m_pHead;
while (begin)
{
ListNode *del = begin;
begin = begin->m_pNext;
delete del;
}
}
public:
//
void PushBack(const DataType &x)
{
if (m_pHead == NULL)
{
m_pHead = new ListNode(x);
m_pTail = m_pHead;
}
else
{
m_pTail->m_pNext = new ListNode(x);
m_pTail = m_pTail->m_pNext;
}
}
//
ListNode *find(const DataType&x)
{
ListNode *tmp = m_pHead;
while (tmp != NULL)
{
if(tmp->m_data == x)
return tmp;
else
{
tmp = tmp->m_pNext;
}
}
return NULL;
}
// O(1) , , :
void DeleteNodeNumone(ListNode **phead, ListNode *pToBeDelete)
{
if(*phead == nullptr || pToBeDelete == nullptr)
return;
if(pToBeDelete->m_pNext != nullptr)
{
ListNode *temp = pToBeDelete->m_pNext;
pToBeDelete->m_data = temp->m_data;
pToBeDelete->m_pNext = temp->m_pNext;
delete temp;
temp = nullptr;
}
//only one node
else if(*phead == pToBeDelete)
{
delete pToBeDelete;
pToBeDelete = nullptr;
*phead = nullptr;
}
//
else
{
ListNode *cur = *phead;
while (cur->m_pNext != pToBeDelete)
{
cur = cur->m_pNext;
}
delete pToBeDelete;
pToBeDelete = nullptr;
cur->m_pNext = nullptr;
}
}
void print()
{
ListNode *begin = m_pHead;
while (begin)
{
cout<m_data<<"->";
begin = begin->m_pNext;
}
cout<<"NUll"<<endl;
}
public:
ListNode *m_pHead;
ListNode *m_pTail;
};
#endif //_HEAD_H_
main.cpp
int main()
{
Slist s1;
s1.PushBack(5);
s1.PushBack(2);
s1.PushBack(3);
s1.PushBack(2);
s1.PushBack(1);
s1.PushBack(6);
s1.PushBack(7);
s1.PushBack(9);
s1.print();
ListNode *num = s1.find(9);
s1.DeleteNodeNumone(&s1.m_pHead, num);
s1.print();
num = s1.find(6);
s1.DeleteNodeNumone(&s1.m_pHead, num);
s1.print();
return 0;
}
테스트는 정상적으로 통과할 수 있다.
전재 대상:https://www.cnblogs.com/qq702368956/p/7242413.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.