题目:
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
思路:
3种情况:1、只有一个结点,且要删除的就是第一个结点???遇到链表时一定要单独考虑只有一个结点的情况
2、要删除的结点不是最后一个结点,这时不需要查找,直接用后面一个结点的值代替前面一个结点,然后删除后一个结点
3、要删除的结点是最后一个结点,这时需要先遍历到倒数第二个结点
代码:
#include<iostream>
using namespace std;
//功能:O(1)时间内删除链表中的某个结点
//3种情况:1、只有一个结点,且要删除的就是第一个结点???遇到链表时一定要单独考虑只有一个结点的情况
// 2、要删除的结点不是最后一个结点,这时不需要查找,直接用后面一个结点的值代替前面一个结点,然后删除后一个结点
// 3、要删除的结点是最后一个结点,这时需要先遍历到倒数第二个结点
struct ListNode
{
int m_nValue;
ListNode *m_pNext;
ListNode(){}
ListNode(int x):m_nValue(x),m_pNext(NULL){}
};
void DeleteNode(ListNode *pListHead , ListNode *pToBeDeleted)
{
if(pListHead == NULL || pToBeDeleted == NULL)
return;
ListNode *q = pToBeDeleted->m_pNext;
if(q != NULL) //第二种情况
{
pToBeDeleted->m_nValue = q->m_nValue;
pToBeDeleted->m_pNext = q->m_pNext;
delete q;
q = NULL;
return;
}
if(pListHead == pToBeDeleted) //第一种情况
{
delete pToBeDeleted;
pToBeDeleted = NULL;
pListHead = NULL;
return;
}
ListNode *pre = pListHead;
while(pre->m_pNext != pToBeDeleted) //第三种情况
{
pre = pre->m_pNext;
}
pre->m_pNext = pToBeDeleted->m_pNext;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
int main()
{
ListNode *head = new ListNode(1);
ListNode *p2 = new ListNode(2);
ListNode *p3 = new ListNode(3);
head->m_pNext = p2;
p2->m_pNext = p3;
ListNode *p = head;
//DeleteNode(p , p);
//DeleteNode(p , p2);
DeleteNode(p , p3);
while(p)
{
cout<<p->m_nValue<<endl;
p = p->m_pNext;
}
}