剑指offer—第三章高质量代码(o(1)时间删除链表节点)
2015-06-09 21:25
567 查看
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue;};void DeleteNode(ListNode** pListNode,ListNode * pToBeDeleted){}
思路:将要删除的节点的下一个节点的值赋值给i,删除下一个节点,但要考虑到删除的节点是最后一个节点并且该链表不止有一个节点的情况和该链表只有一个节点,该节点既是头节点也是尾节点的情况。
C++代码:
Java代码:
思路:将要删除的节点的下一个节点的值赋值给i,删除下一个节点,但要考虑到删除的节点是最后一个节点并且该链表不止有一个节点的情况和该链表只有一个节点,该节点既是头节点也是尾节点的情况。
C++代码:
#include<iostream> using namespace std; 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) { ListNode *p=pHead; while(p) { cout<<p->m_nValue<<" "; p=p->m_pNext; } cout<<endl; } 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; } } void main() { int a[]={1,2,3}; ListNode * Head=CreateLink(a,3); printLink(Head); ListNode* pNode=Head; while(pNode->m_nValue!=a[1]&&pNode) pNode=pNode->m_pNext; if(!pNode) { printf("不存在这样的节点"); } else DeleteNode(&Head,pNode); printLink(Head); cout<<endl; }
Java代码:
public class SingleLinkList { public static class ListNode { public int m_nValue; public ListNode m_pNext; } //创建链表 public static 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; } //从头到尾打印列表 public static void printLink(ListNode pHead) { ListNode p=pHead; while(p != null) { System.out.print(p.m_nValue+" "); p=p.m_pNext; } System.out.println("\n"); } public static void DeleteNode(ListNode pListHead,ListNode pToBeDeleted) { if(pListHead==null||pToBeDeleted==null) { return; } //要删除的节点后面有节点 if(pToBeDeleted.m_pNext!=null) { ListNode pNext=pToBeDeleted.m_pNext; pToBeDeleted.m_nValue=pNext.m_nValue; pToBeDeleted.m_pNext=pNext.m_pNext; } //要删除的节点是头结点,也是最后一个节点 else if(pListHead==pToBeDeleted) { pToBeDeleted=null; pListHead=null; } else { ListNode pNode=pListHead; while(pNode.m_pNext!=pToBeDeleted) { pNode=pNode.m_pNext; } pNode.m_pNext=null; pToBeDeleted=null; } } public static void main(String[] args) { int a[]={1,2,3}; ListNode Head=CreateLink(a,3); printLink(Head); ListNode pNode=Head; while(pNode.m_nValue!=a[1]&&pNode!=null) pNode=pNode.m_pNext; if(pNode==null) { System.out.println("不存在这样的节点"); } else DeleteNode(Head,pNode); printLink(Head); System.out.println("\n"); } }
相关文章推荐
- 图片轮播,纯js+css
- J2EE学习(1)—jsp的基础知识汇总
- CSS Selectors
- JSP注释和声明
- jQuery Validate验证框架详解
- 使用 jQuery 进行前端验证 -- 1
- js键盘事件全面控制 兼容FireFox和IE
- HTML5新标签之Canvas
- 安装 Fedora 20/21/22 后要做的
- openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))
- POJ 2761 Feed the dogs(树状数组求区间第K大)
- NodeJs测试
- 非常简单的js双向绑定框架(二):控制器继承
- 使用.net和jquery实现一对一的网页聊天系统
- [R语言绘图]绘图样式设置(符号、线条、颜色、文本属性)
- 是有JavaScript判断表单元素是否为空
- screenX clientX pageX的区别
- CSS Properties and CSS Rules
- jsp简易留言板
- NodeJS异常处理uncaughtException篇