在O(1)时间删除链表的节点
题目:
给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,
我们要删除一个节点i,先把i的下一个节点j的内容复制到i,然后把i 的指针指向节点j的下一个节点。此时再删除节点
j,其效果就是把节点i给删除了 。
题目:
给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,
我们要删除一个节点i,先把i的下一个节点j的内容复制到i,然后把i 的指针指向节点j的下一个节点。此时再删除节点
j,其效果就是把节点i给删除了 。
#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
void deleteNode(ListNode** pListHead,ListNode* pToBeDeleted)
{
if(!pListHead||!pToBeDeleted)
return ;
//删除的节点不是尾节点
if(pToBeDeleted->m_pNext!=NULL)
{
ListNode* pNext=pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue=pNext->m_nValue;
pToBeDeleted->m_pNext=pNext->m_pNext;
delete pNext;
pNext=NULL;
}
//链表只有一个节点,删除头节点(也是尾节点)
else if(*pListHead==pToBeDeleted)
{
delete pToBeDeleted;
pToBeDeleted=NULL;
*pListHead=NULL;
}
//链表中有多个节点,删除尾节点
else
{
ListNode* pNode=*pListHead;
while(pNode->m_pNext!=pToBeDeleted)
{
pNode= pNode->m_pNext;
}
pNode->m_pNext=NULL;
delete pToBeDeleted;
pToBeDeleted =NULL;
}
}
int main()
{
int nodeNum,deleted;
while(scanf("%d %d",&nodeNum,&deleted)!=EOF)
{
int data;
scanf("%d",&data);
ListNode* listHead=(ListNode*)malloc((sizeof(ListNode)));
if(listHead==NULL)
exit(EXIT_FAILURE);
listHead->m_nValue=data;
listHead->m_pNext=NULL;
ListNode* pCur=listHead;
ListNode* pDeleted = pCur;
int curNum=nodeNum;
for(int i=0;i<nodeNum-1;i++)
{
int nodeData;
scanf("%d",&nodeData);
ListNode* newNode=(ListNode*)malloc(sizeof(ListNode));
if(newNode==NULL)
exit(EXIT_FAILURE);
newNode->m_nValue=nodeData;
newNode->m_pNext=NULL;
pCur->m_pNext=newNode;
pCur=pCur->m_pNext;
if(pCur->m_nValue==deleted)
{
pDeleted=pCur;
curNum--;
}
}
deleteNode(&listHead,pDeleted);
ListNode* pNode=listHead;
for(int i=0;i<curNum;i++)
{
printf("%d",pNode->m_nValue);
pNode=pNode->m_pNext;
}
}
return 0;
}
结果: