【剑指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(); }
相关文章推荐
- 剑指offer-13:在O(1)时间删除链表结点
- 【剑指Offer学习】【面试题13 :在O(1)时间删除链表结点】
- 剑指Offer面试题12打印1到最大的n位数,面试题13在O(1)时间删除链表结点
- 剑指Offer----面试题13:在O(1)时间删除链表结点
- 【剑指Offer】面试题13:在O(1)时间删除链表结点
- 剑指offer--面试题13:在O(1)时间删除链表结点--Java实现
- 剑指offer题13_在O(1)时间内删除链表结点
- [剑指offer][面试题13]在O(1)时间删除链表结点
- 剑指offer面试题13——在O(1)时间删除链表结点
- 【剑指offer】面试题13、在 O(1)时间上删除链表结点
- 【面试题】剑指offer13--在O(1)时间删除链表结点
- 剑指offer13:在O(1)时间删除链表结点
- 剑指offer13 在O(1)时间删除链表的结点
- 剑指Offer-13-在O(1)时间删除链表结点
- 剑指offer之面试题13在O(1)时间删除链表结点
- 剑指offer-面试题13-在O(1)时间删除链表结点
- 剑指offer-面试题 13:在 O( 1)时间删除链表结点
- 剑指offer-13:在O(1)时间删除链表结点
- 剑指offer--面试题13:在O(1)时间删除链表结点
- 【剑指offer 面试题13】在 O(1) 时间删除链表结点