您的位置:首页 > Web前端

【剑指offer】链表相关-在o(1)时间删除链表结点13

2014-03-03 16:52 696 查看
#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;
}
//在o(1)时间内删除链表结点
//方法是,将被删除的结点的下一个值赋值到删除结点,然后删除被删除结点的下一个结点
//删除最后一个结点时比较特殊
//此方法的前提是结点存在于链表内
//自己写的程序
void DeleteNode1(ListNode **pListNode,ListNode * pToBeDeleted)
{
if(pListNode == NULL || *pListNode == NULL)
return;
//要删除的是第一个结点,此情况包含第一个结点即为最后一个结点的情况
if(*pListNode==pToBeDeleted)
{
*pListNode=pToBeDeleted->m_pNext;
delete pToBeDeleted;
pToBeDeleted=NULL;
return;
}
//要删除的是最后一个结点
if(pToBeDeleted->m_pNext==NULL)
{
ListNode * p=*pListNode;
while(p->m_pNext!=pToBeDeleted)
p=p->m_pNext;
p->m_pNext=NULL;
delete pToBeDeleted;
pToBeDeleted=NULL;
}
else
{
pToBeDeleted->m_nValue=pToBeDeleted->m_pNext->m_nValue;
ListNode * del= pToBeDeleted->m_pNext;
pToBeDeleted->m_pNext=pToBeDeleted->m_pNext->m_pNext;
delete del;
del=NULL;
}
}
//书上的
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;
}
}
//=========测试用例=========
//1.链表中有多个结点,删除尾结点
void Test1()
{
cout<<"测试用例test1"<<endl;
int a[]={1,2,3};
ListNode * ptr=CreateLink(a,3);
ListNode *del=ptr;
while(del->m_nValue!=3)
del=del->m_pNext;
printLink(ptr);
DeleteNode(&ptr,del);
printLink(ptr);
}
//2.链表中有多个结点,删除首结点
void Test2()
{
cout<<"测试用例test2"<<endl;
int a[]={1,2,3};
ListNode * ptr=CreateLink(a,3);
ListNode *del=ptr;
while(del->m_nValue!=1)
del=del->m_pNext;
printLink(ptr);
DeleteNode(&ptr,del);
printLink(ptr);
}
//3.链表中有多个结点,删除中间结点
void Test3()
{
cout<<"测试用例test3"<<endl;
int a[]={1,2,3};
ListNode * ptr=CreateLink(a,3);
ListNode *del=ptr;
while(del->m_nValue!=2)
del=del->m_pNext;
printLink(ptr);
DeleteNode(&ptr,del);
printLink(ptr);
}
//4.链表中有一个结点
void Test4()
{
cout<<"测试用例test4"<<endl;
int a[]={1};
ListNode * ptr=CreateLink(a,1);
ListNode *del=ptr;
while(del->m_nValue!=1)
del=del->m_pNext;
printLink(ptr);
DeleteNode(&ptr,del);
printLink(ptr);
}
//5.链表为空
void Test5()
{
cout<<"测试用例test5"<<endl;
ListNode * ptr=NULL;
ListNode *del=ptr;
printLink(ptr);
DeleteNode(&ptr,del);
printLink(ptr);
}
void main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: