// 在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. Putty server refused our key的解决方法

    在使用putty工具使用密钥远程登陆CentOS系统时,出现Putty server refused our key提示,解决办法: 1.查看是否关掉SELINUX. 相关命令:getenforce, ...

  2. sizeof(long)

    16位系统:long是4字节,int是2字节32位系统:long是4字节,int是4字节64位系统:long是8字节,int是4字节

  3. [转载]Linux的时间与时钟中断处理

    本文主要介绍在Linux下的时间实现以及系统如何进行时钟中断处理. 一. Linux的硬件时间 PC机中的时间有三种硬件时钟实现,这三种都是基于晶振产生的方波信号输入.这三种时钟为: 实时时钟RTC ...

  4. tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式

     tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式  https://github.com/zhangzheyuk/CaseConvert

  5. 关于DevExpress的gridControl的简单使用

    数据绑定 首先生成table,然后更改列名,最后添加一个选择列,类型为"System.Boolean",这样在绑定上gridcontrol的时候会出现一列选择框 table.Col ...

  6. React 入门最好的实例-TodoList

    React 的核心思想是:封装组件,各个组件维护自己的状态和 UI,当状态变更,自动重新渲染整个组件. 最近前端界闹的沸沸扬扬的技术当属react了,加上项目需要等等原因,自己也决定花些时间来好好认识 ...

  7. 设置程序图标-初识IOS

    相信我们都很喜欢做出的程序弄成自己的图标. 在创建项目过后显示的页面中,选择App lcons and launch images,  点击App lcons Source 之后的方向符号,把里面的东 ...

  8. Android下Affinities和Task

    源文链接:http://appmem.com/archives/405 本文参考了官方Dev Guide文档,简单介绍Android下的affinities和任务(task). 1.Activity和 ...

  9. linux下安装软件的方法

    1. 区分 rpm -qi -qf -ql -qa四个不同选项组合的作用?rpm -qi //查询已经安装的某个RPM软件包的信息rpm -qf //查询某个程序文件是由哪个RPM软件包安装的rpm ...

  10. poj3614 贪心

    Sunscreen Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6410   Accepted: 2239 Descrip ...