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

来源:互联网 发布:redis切换数据库命令 编辑:程序博客网 时间:2024/06/06 04:24
#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();}


0 0
原创粉丝点击