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

#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();

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值