删除单链表节点,时间复杂度为O(1)
一个编程练习,删除单链表一个节点,且时间复杂度控制在O(1)内.
1.核心操作代码如下:
struct ListNode
{
int m_data;
ListNode *m_pNext;
}; void DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted)
{
if(pListHead == NULL || pToBeDeleted == NULL)
return;
//=================================================
//删除非尾节点
if(pToBeDeleted->m_pNext != nullptr)
{
ListNode *temp = pToBeDeleted->m_pNext;
pToBeDeleted->m_data = temp->m_data;
pToBeDeleted->m_pNext = temp->m_pNext; delete temp;
temp = nullptr;
}
//=================================================
//只有一个节点 删除头
else if(pToBeDeleted == *pListHead)
{
delete pToBeDeleted;
pToBeDeleted = nullptr;
*pListHead = nullptr;
} //最后一种 删除节点是尾节点
else
{
ListNode *cur = *pListHead;
while (cur->m_pNext != pToBeDeleted)
{
cur = cur->m_pNext;
}
delete pToBeDeleted;
pToBeDeleted = nullptr;
cur->m_pNext = nullptr;
}
}
2.完整的测试实现代码如下:
头文件
#ifndef _HEAD_H_
#define _HEAD_H_ typedef int DataType; class ListNode
{
public:
ListNode(const DataType & x):m_data(x), m_pNext(NULL){} DataType m_data;
ListNode * m_pNext;
}; class Slist
{
public:
Slist():m_pHead(NULL), m_pTail(NULL)
{} ~Slist()
{
Destroy();
} void Destroy()
{
ListNode *begin =m_pHead;
while (begin)
{
ListNode *del = begin;
begin = begin->m_pNext;
delete del;
}
}
public:
//尾插法
void PushBack(const DataType &x)
{
if (m_pHead == NULL)
{
m_pHead = new ListNode(x);
m_pTail = m_pHead;
}
else
{
m_pTail->m_pNext = new ListNode(x);
m_pTail = m_pTail->m_pNext;
}
}
//查找
ListNode *find(const DataType&x)
{
ListNode *tmp = m_pHead;
while (tmp != NULL)
{
if(tmp->m_data == x)
return tmp;
else
{
tmp = tmp->m_pNext;
}
}
return NULL;
} //在O(1)时间内, 删除一个节点,函数如下:
void DeleteNodeNumone(ListNode **phead, ListNode *pToBeDelete)
{
if(*phead == nullptr || pToBeDelete == nullptr)
return; if(pToBeDelete->m_pNext != nullptr)
{
ListNode *temp = pToBeDelete->m_pNext;
pToBeDelete->m_data = temp->m_data;
pToBeDelete->m_pNext = temp->m_pNext; delete temp;
temp = nullptr;
}
//only one node
else if(*phead == pToBeDelete)
{
delete pToBeDelete;
pToBeDelete = nullptr;
*phead = nullptr;
} //删除节点是尾节点
else
{
ListNode *cur = *phead;
while (cur->m_pNext != pToBeDelete)
{
cur = cur->m_pNext;
}
delete pToBeDelete;
pToBeDelete = nullptr;
cur->m_pNext = nullptr;
}
} void print()
{
ListNode *begin = m_pHead;
while (begin)
{
cout<<begin->m_data<<"->";
begin = begin->m_pNext;
}
cout<<"NUll"<<endl;
}
public:
ListNode *m_pHead;
ListNode *m_pTail;
}; #endif //_HEAD_H_
main.cpp
int main()
{
Slist s1;
s1.PushBack();
s1.PushBack();
s1.PushBack();
s1.PushBack();
s1.PushBack();
s1.PushBack();
s1.PushBack();
s1.PushBack();
s1.print(); ListNode *num = s1.find(); s1.DeleteNodeNumone(&s1.m_pHead, num);
s1.print(); num = s1.find();
s1.DeleteNodeNumone(&s1.m_pHead, num); s1.print();
return ;
}
测试可以正常通过.
删除单链表节点,时间复杂度为O(1)的更多相关文章
- 13:在O(1)时间删除单链表节点
题目:给定单项链表的头指针和一个节点指针.定义一个函数在O(1)时间删除该节点. 解析: 删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才干实现.而这样做的时间复杂度是O(n).无 ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- 删除单链表倒数第n个节点
基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- 在O(1)时间内删除单链表结点
// 在O(1)时间内删除单链表结点 /* 思考: 很显然链表是一个节点地址不连续的存储结构 删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next 然而除非是双向链表,否则 ...
- leetCode题解之删除单链表中指定的元素
1.问题描述 Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> ...
- PHP之从反向删除单链表元素的问题谈起
在完成一个单链表的删除指定元素的题目中,我发现了一件神奇的事情,php对象赋值给另外一个变量后,可以如同引用传值一般继续利用新的变量来实现链表的链接. 后面经过查证后发现: PHP7.0版本除了对象, ...
- cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针
实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...
- 用O(1)的时间复杂度删除单链表中的某个节点
给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: ...
随机推荐
- Django框架简介-路由系统
2.2 路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是 ...
- 【C/C++】C++11 Move, Forward
左值与右值 Lvalue:可以出现在 operator= 左边的 Rvalue:只能出现在operator= 右边的 ; int a = b; a = b; a = a + b; a + b = a; ...
- react生命周期-新增与替换
class A extends React.Component { // 用于初始化 state constructor() {} // 用于替换 `componentWillReceiveProps ...
- 简单的jQuery hide()方法演示
<!DOCTYPE html><html><head><meta charset="utf-8"> <title>jQu ...
- python - 列表,元组
1.列表 定义:能装对象的对象 在python中使用[] 来描述列表,内部元素用逗号隔开,对数据类型没有要求. 列表存在索引和切片,和字符串的操作是一样的 2.列表相关 ...
- fibos开发踩坑集合
fibos.js API资料: 与eosjs相比,fibos.js没有添加新功能,可以在eosjs项目页面https://developers.eos.io/eosio-nodeos/referenc ...
- There are multiple modules with names that only differ in casing. 黄色warning
There are multiple modules with names that only differ in casing.有多个模块同名仅大小写不同This can lead to unexp ...
- c# Process cmd 执行完回调 Proc_OutputDataReceived mysql mysqldump mysql source备份还原数据
c# Process 执行完回调 Proc_OutputDataReceived mysql mysqldump mysql source备份还原数据 直接贴代码 前提:mysql5.7 vs2017 ...
- 在 ubuntu18.04 中搭建 Django 开发环境
在Ubuntu 18.04 安装 python3.pip3.pycharm,搭建 Django 开发环境. 1.安装 python3 pip3 sudo apt-get install python3 ...
- docker 镜像运行问题