USACO44 TimeTravel 时间旅行(链表)】的更多相关文章

第一眼看到这题,woc,这不是主席树!?旁边HZ也表示同意,然后cGh队长就慢悠悠的过来:“想什么,USACO会有主席树!?” ↓打脸不解释,大家可以去%ta的博客(这样ta就不会D飞我了~)http://blog.csdn.net/cgh_andy/article/details/53012348 既然师兄都说链表了,如果用主席树(就是可持久化线段树啦)水,不是很不给面子...... 所以就学了一发,果然又快又短~其实代码很好理解的(强行引用) 我们设c[i]为i位置最近买的牛 f[i]表示上…
一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class Node<T> { // 数据域 public T Item { get; set; } // 指针域 public Node<T> Next { get; set; } public Node() { } public Node(T item) { this.Item = item;…
[面试题013]在O(1)时间删除链表结点  我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表的尾部: 2.如果结点i位于链表的头部: 3.如果结点i既是链表的头部又是链表的尾部: DeleNode.cpp: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505…
下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点.具体示例程序如下: //O(1)时间删除链表节点,从无头单链表中删除节点 void deleteRandomNode(Node *cur) { assert(cur != NULL); assert(cur->next != NULL); //不能是尾节点 Node* pNext = cur->n…
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 思路 通常那样从头开始查找删除需要的时间为O(n),要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j. 注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历:2.当链…
// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> #include "List.h" void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) { if (!pListHead || !pToBeDeleted) return; // 第一种情况:要删除的结点不是尾结点 i…
/** * 在O(1)的时间删除链表的节点 * * @author * */ public class Solution { public static void deleteNode(Node head, Node deletedNode) { if (null == head || null == deletedNode) { return; } if (deletedNode.next != null) { // 删除的不是尾节点 System.out.println("1-----&qu…
// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点.链表结点与函数的定义如下: // struct ListNode{ // int m_nValue; // ListNode* m_pNext; // }; // void deleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 解题思路: 这是目前为止,唯一一道,我不看书就知道怎么做的题. 正…
题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删除节点的下一个节点j复制到待删除节点i上,然后将i的下一个节点指向j的下一个节点,删除j的节点. 3.对于尾节点,需要从头开始遍历 4.对于只有一个节点的链表,要将*HeadNode设置为Nullptr. 5.时间复杂度 n-1个非尾节点,时间O(1) 1个尾节点,时间O(n) 最终((n-1)*O…
[题目] 给定链表的头指针和一个结点指针.在O(1)时间删除该结点.链表结点的定义例如以下: struct ListNode { int        value; struct ListNode*  next; }; 函数的声明例如以下: void DeleteNode(ListNode* head,ListNode* node); [思路] 这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解. 在链表中删除一个…
///////////////////////////////////////////////////////////////////////////////////// // 3. 题目13 在O(1)时间删除链表节点 // 平均时间复杂度:[(n-1)*O(1) + O(n)] / n ---> O(1) void DeleteListNode(ListNode<int>** ppNode, ListNode<int>* pDelNode) { if (NULL == p…
一:什么是时间旅行 简而言之就是把程序的执行流拍成vlog,这样就可以对 vlog 快进或者倒退,还可以分享给别人做进一步的分析,是不是想都不敢想. 很开心的是 windbg preview 版本中已经实现了,叫做 时间旅行调试 TTD,相比传统的 静态分析 不知道好多少倍. 为了能提起大家兴趣,我就举二个例子吧. 二:二个有趣的例子 1. 查看程序都触发了第几代垃圾回收 为了方便说明,我就用诱导GC手工触发,然后再观察都触发了哪一代的 GC ,参考代码如下: static void Main(…
[题目] 给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下:  C++ Code  123456   struct ListNode {     int        m_nKey;     ListNode  *m_pNext; }; 函数的声明如下:  C++ Code  1   void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted); [分析] 这是一道广为流传的Google面试题,能有效考察我们…
问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode next; public ListNode(int v){value = v;} } 思路:常规的做法就是遍历链表找到被删除结点的前趋p,然后改变p->next的指向即可.但是这种做法的时间复杂度为O(n). 因此我们要另寻他路.现在我们已知了要删除的结点指针,那么我们很容易获得它的后继,那么显然我…
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue;};void DeleteNode(ListNode** pListNode,ListNode * pToBeDeleted){} 思路:将要删除的节点的下一个节点的值赋值给i,删除下一个节点,但要考虑到删除的节点是最后一个节点并且该链表不止有一个节点的情况和该链表只有一个节点,该节点既是头节点也…
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 思路:我们可以很方便的得到要删除的结点的下一结点,如果我们把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除.就相当于把当前需要删除的…
题目:给定单向链表的头指针和一个结点指针,定义一个函数在o(1)时间删除该结点.链表结点与函数的定义如下:struct ListNode{       int m_nValue;       ListNode *m_pNext;    }void DeleteNode(Listnode** pListHead, ListNode* pToBeDeleted); 思路:将要删除的结点的下一个结点的值复制到要删除的结点,删除下一个结点.如果是要删除最后一个结点,则要从头开始搜索.   测试用例: 1…
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 分析:这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反…
//给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 1 struct ListNode //结点结构 { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead , ListNode* pToBeDeleted) { if (!pListHead || !pToBeDeleted) { return; } if (pToBeDeleted->m_pNext != NULL) {…
问题描述:给定单相链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 这个比较简单,做不做解释,直接看参考代码,不过有一点就是要注意,还是要看删除的节点类型,不能保证总是O(1)时间 参考代码: void DeleteNode(ListNode** pHead,ListNode *pTobeDelete){    if ((pHead == NULL) || (*pHead == NULL) || (pTobeDelete == NULL))    {        return…
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next指向删除节点的next即可,这样看来删除一个节点 的复杂度为O(n)然而我们其实遍历的目的只是想获取想要删除节点的前一 个节点. 那么我们可以这样考虑: 我们把要删除节点下一个节点的值赋值到当前节点,然后将当前节点的下一个 节点删除即可. 比如: 一个链表3->2->5->7->9给定…
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 删除结点的操作我们经常碰到,比如一个链表A->B->C->D->E->F->G.如果我们要删除结点E,那么我们只需要让结点D的指针指…
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 给定单向链表的头指针和一个结点指针,定义一个函数在 O(1) 时间删除该结点.链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted); 算法设计思想 通常,在单向链表…
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int val; ListNode* next; }; 分析:如下图所示,假设要删除的结点为p结点,若直接删除p结点,则必须知道p的上一个结点,而查找p的上一个结点的时间复杂度为O(N).可以交换p和p的下一个结点q的数据,然后直接删除q,这样便保证了时间复杂度为O(1).需要注意的是p为尾结点的情况.这时只能顺序遍历链表并完成删除操作. ListNo…
问题描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. package Problem13; /* * 问题描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. * */ //定义结点的结构 class ListNode { ListNode nextNode; int nodeValue; } public class DeleteNode { public static void deleteNode(ListNode head, L…
问题:删除链表节点 要求:以O(1)时间 对于删除指定索引的链表元素大家都很熟悉,思路一般是从头遍历链表直到指定索引位置删除元素,然后维护一下指针即可,时间复杂度O(n).代码如下: // 删除position位置的数据,并返回 int List::erasePosition(int position){ || position>(List::size()-)){ cout<<"position error, please check."<<endl; ;…
地址 https://www.acwing.com/problem/content/description/85/ 题目描述给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点. 假设链表一定存在,并且该节点一定不是尾节点. 样例 输入:链表 ->->-> 删掉节点:第2个节点即6(头节点为第0个节点) 输出:新链表 ->-> 算法1其实不喜欢这种trick的编程这里的删除 其实是将下一个节点的值赋给自己 然后将下一个节点删除 C++ 代码 /** * Defin…
#include <iostream> using namespace std; //构造链表结点 struct ListNode { int val; ListNode *next; ListNode():val(v), next(NULL){}; }; //打印结点 void printList(ListNode *head) { while(head != NULL) { cout<<head->val<<" "; head = head…
这题并不需要从头结点遍历到已知结点,只需要知道已知结点,将改结点下一个结点赋值给它,再删除这个下一个结点就行,其中还需要考虑各种情况. 1)链表为空或者已知结点为空 2)链表只有一个结点,这个结点就是要删除的已知结点 3)要删除的已知结点在链表的末尾,此时就不能将下一个结点复制过去,我们就需要采用传统方法了.从头结点遍历找到该节点的上一个结点 #include "stdafx.h" #include <iostream> using namespace std; typed…
注意分情况讨论: 1. 要删除的不是尾节点 2. 链表只有一个节点 3. 链表中有多个节点,删除尾节点 void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) { if(!pListHead || !pToBeDeleted) return; // 要删除的结点不是尾结点 if(pToBeDeleted->m_pNext != NULL) { ListNode* pNext = pToBeDeleted->m_pNext; p…