一个编程练习,删除单链表一个节点,且时间复杂度控制在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)的更多相关文章

  1. 13:在O(1)时间删除单链表节点

    题目:给定单项链表的头指针和一个节点指针.定义一个函数在O(1)时间删除该节点. 解析: 删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才干实现.而这样做的时间复杂度是O(n).无 ...

  2. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  3. 删除单链表倒数第n个节点

    基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...

  4. C语言实现单链表节点的删除(带头结点)

    我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...

  5. 在O(1)时间内删除单链表结点

    // 在O(1)时间内删除单链表结点 /* 思考: 很显然链表是一个节点地址不连续的存储结构 删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next 然而除非是双向链表,否则 ...

  6. leetCode题解之删除单链表中指定的元素

    1.问题描述 Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> ...

  7. PHP之从反向删除单链表元素的问题谈起

    在完成一个单链表的删除指定元素的题目中,我发现了一件神奇的事情,php对象赋值给另外一个变量后,可以如同引用传值一般继续利用新的变量来实现链表的链接. 后面经过查证后发现: PHP7.0版本除了对象, ...

  8. cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针

    实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...

  9. 用O(1)的时间复杂度删除单链表中的某个节点

    给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: ...

随机推荐

  1. python下基于sokcet的tcp通信——入门篇

    环境 python版本:2.7 IDE:pycharm TCP/UDP协议均为传输层的协议,绝大部分应用程序之间的通信都是使用TCP或UDP,故而在网络通信中及其重要,想详细了解他们之间的差异,可参考 ...

  2. ROM、RAM、CPU、CACHE、FLASH

    内存在电脑中起着举足轻重的作用.内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE).只不过因为RAM是其中最重要的存储器,所以通常所说的内存即指电脑 ...

  3. jquery等待特定元素加载再执行相关函数

    jQuery.fn.wait = function (func, times, interval) { var _times = times || 100, //100次 _interval = in ...

  4. Redis基础知识小结

    Redis是一个高性能的key-value型数据库.Redis能读的速度是110000次/s,写的速度是81000次/s ,性能极高.Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全 ...

  5. sql 2012 用户sa登陆不上

    1.通过Windows身份验证进入服务器 2.点击“安全性”--“登录名”--“sa” 3.右击sa,点击“属性” 4.取消“强制实施密码策略(F)”勾选 5.对密码重新输入 6.点击确定,重新用SQ ...

  6. 笔记《JavaScript 权威指南》(第6版) 分条知识点概要1—词法结构

    [词法结构]字符集.注释.直接量.标识符和保留字.可选的分号 [字符集] JavaScript程序是用Unicode字符集编写的. Unicode是ASCII和Latin-1的超集,支持地球上几乎所有 ...

  7. Safari 里的javascript 里不能用submit作为函数名

    Safari 里的javascript 里不能用submit作为函数名, 这样写的时候,怎么也运行不了JeasyUI的onSubmit的function, 改个名就可以了.而在chrome下面就没问题 ...

  8. SQL语句全解,非常棒!

    链接自W3school非常详细的SQL教程 http://www.w3school.com.cn/sql/index.asp

  9. css修改原生radio样式

    日常工作中经常会用到单选框radio,而原生样式不好看无法满足项目要求,模拟写一个又比较麻烦,所以写了一个改变原生样式的demo. 原生样式: 改变后的样式: 以下为demo代码: <!DOCT ...

  10. Firebug: 已拦截跨源请求:同源策略禁止读取位于XXX的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-

    第一种,就是在被请求的程序中添加HTTP头,即CORS跨域(跨域资源共享,Cross-Origin Resource Sharing) 如: Response.Headers.Add("Ac ...