// 在O(1)时间内删除单链表结点
/*
思考:
很显然链表是一个节点地址不连续的存储结构
删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next
然而除非是双向链表,否则无法在常量级的时间里找到p的前节点 转变思路:
既然改变不了p前节点的next
只能在p 本身动手脚
那可以考虑修改p->data
使得p->data的值为p->next->data的值,同样可以达到效果
*/ #include <iostream>
#include <string>
using namespace std; int L_length = ; template<class T>
struct Node {
T value;
Node *next;
Node() {
next = NULL;
}
Node(const T &data) {
value = data;
next = NULL;
}
const Node& operator=(const Node& n) {
value = n.value;
next = n.next;
return *this;
}
}; template<class T>
void PushinList(Node<T>* &L,const T &t) {
Node<T> *n = new Node<T>(t);
n->next = L->next;
L->next = n;
L_length++;
} template<class T>
Node<T>* FindP(const Node<T>* L,const int &k) {
Node<T>* p = L->next;
for (int i = ; i < L_length && i + != k; i++) p = p->next;
return p;
} template<class T>
void PrintList(const Node<T>* L) {
cout << "打印链表:";
for (Node<T>* p = L->next; p != NULL; p = p->next) cout << p->value << " ";
cout << endl;
} int main(void) { Node<string>* L = new Node<string>();
string str;
cout << "创建链表(以-1结尾):";
while (cin >> str && str != "-1")
PushinList(L, str);
PrintList(L);
int k;
cout << "指定节点位置:";
cin >> k;
Node<string>* p = FindP(L, k);
//通过重载=操作符直接拷贝*(p->next)下的所有值给*p
*p = *(p->next);
PrintList(L);
system("pause");
return ;
} /*
样例输入:
a b c d e f g h -1
3
样例输出:
h g e d c b a
*/

在O(1)时间内删除单链表结点的更多相关文章

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

    给定单链表的一个结点的指针,同时该结点不是尾结点,此外没有指向其它任何结点的指针,请在O(1)时间内删除该结点. int deleteNode(LNode **head, LNode **node) ...

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

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

  3. O(1)时间内删除指定链表结点

    题目 给定单链表头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点. 分析 对于上图实例链表(a)删除指针p有两种方式 思路1:(b)找到前一个指针pre,赋值pre->next = ...

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

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

  5. pta 奇数值结点链表&&单链表结点删除

    本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; ...

  6. 删除单链表节点,时间复杂度为O(1)

    一个编程练习,删除单链表一个节点,且时间复杂度控制在O(1)内. 1.核心操作代码如下: struct ListNode { int m_data; ListNode *m_pNext; }; voi ...

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

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

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

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

  9. 在O(1)时间删除指定链表结点

    #region 在O(1)时间删除指定链表结点 /// <summary> /// 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. /// </summa ...

随机推荐

  1. paip.sql索引优化----join 代替子查询法

    paip.sql索引优化----join 代替子查询法 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...

  2. python linecache标准库基础学习

    #python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...

  3. 为iPhone6设计自适应布局(二)

    Size Classes 自适应布局的布局约束自然是好东西,但也不是万能的,有时候我们也需要使用最基本的布局,所以使用size classes将它们两者结合起来才能碰撞出更有激情的火花. 引用我上篇译 ...

  4. Dynamics CRM 2016 使用Plug-in Trace Log调试插件

    1.写插件 首先,让我们写一个简单的插件来测试新插件跟踪日志功能.请注意,在下面的示例代码中,我们增加ITracingService的一个实例,以及记录有关插件的执行信息记录的一些键值: 2.注册插件 ...

  5. fopen(),fclose() 打开/关闭文件

    打开/关闭/刷新流 1. fopen() 打开流 功能: 1)fopen()打开由 path指定的一个文件. 2)fdopen()获取一个先有的文件描述符,并使一个标准的I/O流与该描述相结合.此函数 ...

  6. js_day13

  7. DropDownList绑定数据

    DDLName.DataSource = myRd;DDLName.DataTextField = "name";//要绑定的字段DDLName.DataValueField = ...

  8. android 5.0 受欢迎的API简介

    android 5.0 作为系统的一次重大升级,给用户和开发者带来了全新的体验.Material Design不但在视觉和操作上更胜一筹,扩展UI工具包同时也引入了大量新的API. 1. 3D视图和实 ...

  9. Js 时间间隔计算(间隔天数)

    function GetDateDiff(startDate,endDate)  {      var startTime = new Date(Date.parse(startDate.replac ...

  10. jquery交替实现隐藏、显示

      <html>   <head>   <title></title>   </head>   <script src="j ...