// 在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. XSS初体验

    主要内容 什么是XSS? XSS的危害有哪些? 常见的XSS漏洞 如何防范XSS?   什么是XSS? 跨站脚本攻击(Cross Site Scripting),是一种 Web 应用程序的漏洞,当来自 ...

  2. Collections.sort()

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

  3. mysql 中的数据类型

    unsigned   既为非负数,用此类型可以增加数据长度! 例如如果    tinyint最大是127,那    tinyint    unsigned    最大   就可以到    127 * ...

  4. Application 可以存储全局变量

    Application.Lock(); Application["Name"]="小亮" Application.UnLock(); Response.Writ ...

  5. 《第一行代码》学习笔记14-UI(3)

    1. (1)所有控件都是直接或间接继承自View,所用的所有布局都是直接或间接继承自ViewGroup的. (2)View是Android中一种最基本的UI组件,可以在屏幕上绘制一块矩形区域,并能响应 ...

  6. Jsp request

    <%@ page language="java" import="java.util.*" pageEncoding="GB18030" ...

  7. C#不用COM组件导出数据到Excel中

    <?xml version='1.0'?><?mso-application progid='Excel.Sheet'?><Workbook xmlns='urn:sch ...

  8. 记一次令人发狂的 bug Eclipse 开不开 tomcat 7.0

    改项目,结果发现以前的项目也出了问题,就删除了系统用户下面workplace里的文件夹,结果,eclipse被清空,重新添加项目,发现一堆bug; 最让我崩溃的是,用tomcat 7.0跑项目,反复出 ...

  9. OpenGL ES 2.0 变换

    基本变换都是通过将表示点坐标的向量与特定的变换矩阵相乘完成的. 进行基于矩阵的变换时,三位空间中点的位置需要表示成齐次坐标形式. 齐次坐标形式:在X.Y.Z3个坐标值后面增加第四个量W,未变换时W值一 ...

  10. poj 2479 dp求分段最大和

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38079   Accepted: 11904 Des ...