您的位置:首页 > 产品设计 > UI/UE

【剑指offer】链表相关-删除value值节点

2014-03-03 15:59 351 查看
#include<iostream.h>
#include <stdio.h>
#include <stack>

struct ListNode
{
int m_nValue;
ListNode * m_pNext;
};
ListNode * CreateLink(int a[],int k)
{
ListNode * Head=NULL,*q=NULL;
for(int i=0;i<k;i++)
{
ListNode * pNew=new ListNode();
pNew->m_nValue=a[i];
pNew->m_pNext=NULL;

if(Head==NULL)
{
Head=pNew;
q=pNew;
}
else
{
q->m_pNext=pNew;
q=q->m_pNext;
}
}
return Head;
}
//从头到尾打印列表
void printLink(ListNode * pHead)
{
cout<<"链表内容为:";
ListNode *p=pHead;
while(p)
{
cout<<p->m_nValue<<" ";
p=p->m_pNext;
}
cout<<endl;
}

//链表中找到第一个含有某值的节点,并删除该结点
void RemoveNode(ListNode ** pHead,int value)
{
if(pHead==NULL)
return;
if(*pHead==NULL)
return;
ListNode * p=*pHead,*q=NULL;
while(p)
{
if(p->m_nValue==value)
{
//第一个结点即为要删除的结点
if(q==NULL)
{
*pHead=(*pHead)->m_pNext;
delete p;
p=NULL;
return;
}
else
{
q->m_pNext=p->m_pNext;
delete p;
p=NULL;
return;
}
}
else
{
q=p;
p=p->m_pNext;
}
}

}
//书上的
void RemoveNode1(ListNode **pHead,int value)
{
if(pHead == NULL || *pHead ==NULL)
return;
ListNode * pToBeDeleted=NULL;
//特殊处理第一个结点即为要删除的结点,注意括号的使用
if((*pHead)->m_nValue == value)
{
pToBeDeleted=*pHead;
*pHead=(*pHead)->m_pNext;
}
else
{
ListNode * pNode=*pHead;
while(pNode->m_pNext!=NULL && pNode->m_pNext->m_nValue!=value)
pNode=pNode->m_pNext;
if(pNode->m_pNext!=NULL && pNode->m_pNext->m_nValue==value)
{
pToBeDeleted=pNode->m_pNext;
pNode->m_pNext=pNode->m_pNext->m_pNext;
}
}
if(pToBeDeleted !=NULL)
{
delete pToBeDeleted;
//这一步很重要,防止操作已经释放的内存空间
pToBeDeleted=NULL;
}
}
//======测试用例========
//1.没有包含该结点
void Test1()
{
cout<<"测试用例test1结果"<<endl;
int a[]={1,2,3};
ListNode * ptr=CreateLink(a,3);
printLink(ptr);
RemoveNode(&ptr,4);
printLink(ptr);
}
//2.结点在第一个位置
void Test2()
{
cout<<"测试用例test2结果"<<endl;
int a[]={1,2,3};
ListNode * ptr=CreateLink(a,3);
printLink(ptr);
RemoveNode(&ptr,1);
printLink(ptr);
}
//3.结点在最后一个位置
void Test3()
{
cout<<"测试用例test3结果"<<endl;
int a[]={1,2,3};
ListNode * ptr=CreateLink(a,3);
printLink(ptr);
RemoveNode(&ptr,3);
printLink(ptr);
}
//4.结点在中间
void Test4()
{
cout<<"测试用例test4结果"<<endl;
int a[]={1,2,3,4,5};
ListNode * ptr=CreateLink(a,5);
printLink(ptr);
RemoveNode(&ptr,3);
printLink(ptr);
}
//5.链表没有结点,空链表
void Test5()
{
cout<<"测试用例test5结果"<<endl;
ListNode * ptr=NULL;
printLink(ptr);
RemoveNode(&ptr,3);
printLink(ptr);
}
//6.只有一个结点
void Test6()
{
cout<<"测试用例test6结果"<<endl;
int a[]={1};
ListNode * ptr=CreateLink(a,1);
printLink(ptr);
RemoveNode(&ptr,1);
printLink(ptr);
}
void main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: