【剑指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(); }
相关文章推荐
- 剑指Offer :面试题13 在O(1)时间删除链表节点
- 剑指offer 57 - 删除链表中重复的节点
- 剑指offer13:O(1)时间删除链表节点
- 剑指offer 面试题12 在O(1)时间删除链表节点
- 剑指offer之删除链表节点
- 剑指offer--面试题13:在O(1)时间删除链表节点
- 剑指offer面试题18:删除链表的节点-java
- 剑指offer--1.删除链表中某个节点 2.从尾到头打印链表
- 剑指Offer之在O(1)时间删除链表节点(题13)
- 【剑指offer】链表相关-在o(1)时间删除链表结点13
- 剑指offer--用O(1)的时间复杂度删除链表的节点
- 剑指offer-面试题13-在O(1)时间删除链表节点
- 【剑指offer-解题系列(57)】删除链表中重复的节点
- 剑指offer:2.3.3链表:删除第一个含有某值节点
- 剑指Offer(java版):在O(1)时间删除链表节点
- 剑指offer之删除链表中重复的节点
- 剑指Offer13:在O(1)时间删除链表节点
- 剑指Offer 面试题18:删除链表节点 Java代码实现
- 剑指offer之在O(1)时间删除链表节点
- 剑指offer_删除链表中重复的节点