一个编程练习,删除单链表一个节点,且时间复杂度控制在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. Java单例实现及分析

    双重检验锁实现方式 public class Singleton { //定义一个私有的空构造方法,防止直接用new实例化 private Singleton() {} private static ...

  2. 基于gensim的LDA主题模型实现 一键式函数打包

    def genlda(textlist,n): ticks = str(time.time()).replace('.','')[-6:-1] nn=str(n) dictionary = corpo ...

  3. Project中最常用的注意点

    最近用Project 2013做计划,做工作量的评估,感觉确实牛逼得一塌糊涂.这几天自己试着做一些手工的计算,与Project的结果进行对比,发现学到的很多东西,网上确实很难道到,花了几天的时间研究, ...

  4. [LeetCode] 80. Remove Duplicates from Sorted Array II ☆☆☆(从有序数组中删除重复项之二)

    https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/discuss/27976/3-6-easy-lines-C% ...

  5. git--编写好代码文件后更新到git仓库流程

    先说一下git仓库分类: Git分为三大部分存储区域1:工作区域(就是你打开编辑器的本地代码仓库)2:提交缓存区域(使用git add 命令暂时放置的区域)3:git远程仓库(使用git push命令 ...

  6. 跟随我在oracle学习php(12)

    DOM 文档对象模型 body:(什么时候)找到标签 操作标签找到标签:(都会返回一个js对象)document.getElementById() 通过iddocument.getElementsBy ...

  7. db2常用语句

    连接数据库 db2 connect to chmgmdb user ch_mgm 断开数据库 db2 disconnect current 查询 db2 "select * from btp ...

  8. 21. Merge Two Sorted Lists★

    题目内容:Merge two sorted linked lists and return it as a new list. The new list should be made by splic ...

  9. @Autowired注解与@Qualifier注解搭配使用

    问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encount ...

  10. sql在所有存储过程中查询包含某字符串的执行语句

    直接在查询分析器中执行以下代码就行: 方法一) select name from sysobjects o, syscomments s where o.id = s.id and text like ...