微软100题(60)在O(1)时间内删除链表结点
2015-06-02 21:54
399 查看
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
思路:删除链表中某个结点,要知道这个结点前面的结点,但是现在要求O(1)时间删除,只知道后面结点的信息,如果把后面结点复制到要删除的结点,删除后面的那个结点就间接实现了 删除指定结点,但是有一种特殊情况,当要删除的结点是最后一个结点时候,则要老老实实从前往后找到最后一个结点的前一个结点
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
思路:删除链表中某个结点,要知道这个结点前面的结点,但是现在要求O(1)时间删除,只知道后面结点的信息,如果把后面结点复制到要删除的结点,删除后面的那个结点就间接实现了 删除指定结点,但是有一种特殊情况,当要删除的结点是最后一个结点时候,则要老老实实从前往后找到最后一个结点的前一个结点
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted) { if(pListHead==NULL || pToBeDeleted==NULL) return; if(pListHead==pToBeDeleted && pToBeDeleted->m_pnext==NULL)//只有一个结点,且删除的是头结点 { delete pToBeDeleted; pToBeDeleted = NULL; pListHead = NULL; } else if(pToBeDeleted->m_pnext!=NULL)//不是尾结点 { ListNode* pnext = pToBeDeleted->m_pnext; pToBeDeleted->m_value = pnext->m_value; pToBeDeleted->m_pnext = pnext->m_pnext; delete pnext; pnext = NULL; } else { ListNode* pnode = pListHead; while (pnode->m_pnext!=pToBeDeleted) { pnode = pnode->m_pnext; } pnode->m_pnext = NULL; delete pToBeDeleted; pToBeDeleted = NULL; } }
相关文章推荐
- having
- Linux Shell脚本攻略(1.12)
- tomcat启动报错:java.net.BindException: Permission denied <null>:80
- android下基本json串的生成与解析
- (初学日记)repeater动态添加行,保存新增数据
- Python的functools模块
- Android广播BroadcastReceiver 二
- 第二次冲刺会议7
- android中实现记住登录密码的界面
- Mac系统安装Rails
- ChrisRenke/DrawerArrowDrawable源码解析
- mongoDB 入门指南、示例
- 第十一周项目-1.1
- iOS_UITextField 基本操作
- 彻底搞定C指针
- Android广播BroadcastReceiver 一
- 基于java的双向链表实现方法
- mongoDB 介绍(特点、优点、原理)
- Cpp primer<<学习函数-实参类型转换、指向函数的指针_3
- 《转》收集最完整的arcgis拓扑处理