面试题13:在O(1)时间删除链表节点】的更多相关文章

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next指向删除节点的next即可,这样看来删除一个节点 的复杂度为O(n)然而我们其实遍历的目的只是想获取想要删除节点的前一 个节点. 那么我们可以这样考虑: 我们把要删除节点下一个节点的值赋值到当前节点,然后将当前节点的下一个 节点删除即可. 比如: 一个链表3->2->5->7->9给定…
这道题的关键是知道找到尾节点的前一个节点必须遍历,而且这样做了之后总的时间复杂度还是O(1),以及如何不破坏链表删除一个已知节点 public ListNode delete(ListNode head, ListNode toBeDelete){ //如果头节点为空或者只有一个节点 if(head == null || head.next == null)return null; //如果要删除的节点在末尾 if(toBeDelete.next == null){ ListNode index…
http://blog.csdn.net/jsqfengbao/article/details/47175249…
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点,通过遍历链表找到该节点的上一节点和下一节点的方法是行不通了.所以实现的思路是,根据给定的要删除的节点,可以直接找到其后年的节点,把后面的节点的内容复制到当前节点处,同时将当前节点指向其后面节点的后面节点保证链表不断开,再把下一节点删掉就相当于把给定的节点删除了. 需要考虑到的一点是,如果要删除的节…
///////////////////////////////////////////////////////////////////////////////////// // 3. 题目13 在O(1)时间删除链表节点 // 平均时间复杂度:[(n-1)*O(1) + O(n)] / n ---> O(1) void DeleteListNode(ListNode<int>** ppNode, ListNode<int>* pDelNode) { if (NULL == p…
问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode next; public ListNode(int v){value = v;} } 思路:常规的做法就是遍历链表找到被删除结点的前趋p,然后改变p->next的指向即可.但是这种做法的时间复杂度为O(n). 因此我们要另寻他路.现在我们已知了要删除的结点指针,那么我们很容易获得它的后继,那么显然我…
下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点.具体示例程序如下: //O(1)时间删除链表节点,从无头单链表中删除节点 void deleteRandomNode(Node *cur) { assert(cur != NULL); assert(cur->next != NULL); //不能是尾节点 Node* pNext = cur->n…
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue;};void DeleteNode(ListNode** pListNode,ListNode * pToBeDeleted){} 思路:将要删除的节点的下一个节点的值赋值给i,删除下一个节点,但要考虑到删除的节点是最后一个节点并且该链表不止有一个节点的情况和该链表只有一个节点,该节点既是头节点也…
问题描述:给定单相链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 这个比较简单,做不做解释,直接看参考代码,不过有一点就是要注意,还是要看删除的节点类型,不能保证总是O(1)时间 参考代码: void DeleteNode(ListNode** pHead,ListNode *pTobeDelete){    if ((pHead == NULL) || (*pHead == NULL) || (pTobeDelete == NULL))    {        return…
问题:删除链表节点 要求:以O(1)时间 对于删除指定索引的链表元素大家都很熟悉,思路一般是从头遍历链表直到指定索引位置删除元素,然后维护一下指针即可,时间复杂度O(n).代码如下: // 删除position位置的数据,并返回 int List::erasePosition(int position){ || position>(List::size()-)){ cout<<"position error, please check."<<endl; ;…
注意分情况讨论: 1. 要删除的不是尾节点 2. 链表只有一个节点 3. 链表中有多个节点,删除尾节点 void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) { if(!pListHead || !pToBeDeleted) return; // 要删除的结点不是尾结点 if(pToBeDeleted->m_pNext != NULL) { ListNode* pNext = pToBeDeleted->m_pNext; p…
题目:给定单向链表的头指针和一个结点指针,定义一个函数在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的指针指…
题目: 在给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点.链表结点与函数的定义如下: struct ListNode{ int val; ListNode* next; }; void deleteNode(ListNode** pListHead,ListNode* pToBeDeleted) 思路: 删除链表结点的一般思路是:从头指针开始遍历,找到要删除结点的前一结点pPrev,然后pPrev->next=pToBeDeleted->next,(还需考虑删除结点…
删除链表的一个结点,用下一个结点覆盖掉要删除的结点,再释放掉要删结点的下一个结点的内存 Java: public ListNode deleteNode(ListNode head, ListNode tobeDelete) { if (head == null || head.next == null || tobeDelete == null) return null; if (tobeDelete.next != null) { // 要删除的节点不是尾节点 ListNode next =…
struct Node { int val; Node * next; }; void deleteNode(Node ** head, Node * target) { assert(head != NULL && *head != NULL && target != NULL); //头结点的判断 if(*head == target) { *head = target->next; delete target; } //尾节点的判断 if(target->…
[面试题013]在O(1)时间删除链表结点  我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表的尾部: 2.如果结点i位于链表的头部: 3.如果结点i既是链表的头部又是链表的尾部: DeleNode.cpp: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505…
// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点.链表结点与函数的定义如下: // struct ListNode{ // int m_nValue; // ListNode* m_pNext; // }; // void deleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 解题思路: 这是目前为止,唯一一道,我不看书就知道怎么做的题. 正…
[题目] 给定链表的头指针和一个结点指针.在O(1)时间删除该结点.链表结点的定义例如以下: struct ListNode { int        value; struct ListNode*  next; }; 函数的声明例如以下: void DeleteNode(ListNode* head,ListNode* node); [思路] 这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解. 在链表中删除一个…
一.题目:在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;…
本文参考自<剑指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…
题目描述:题目描述在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)时间删除该结点.假设链表一定存在,并且该节点一定不是尾节点. 样例 输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节点为第0个节点) 输出:新链表 1->4->8   想法:因为不知道待删除节点的前驱节点,因为无法像常规那样让待删除的链表节点的前驱指向待删除链表节点的后驱节点这种方式 .可以采用让待删除结点下一节点覆盖当前待删除节点.然后删除下一节点 class Solution { public: void…
题目: 在O(1)时间复杂度删除链表节点 给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点.并在删除该节点后,返回表头. 样例 给定 1->2->3->4,和节点 3,返回 1->2->4. 解题: 方法好贱,先把要删除节点后面一个节点的值赋给删除节点,这样需要删除节点就删除了,再把删除节点指向删除节点后面节点的节点 就像这样: node.val = node.next.val; node.next = node.next.…
在O(1)时间复杂度删除链表节点 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 样例 给定 1->2->3->4,和节点 3,删除 3 之后,链表应该变为 1->2->4. 标签 Cracking The Coding Interview 链表 code /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next;…
题目: 在O(1)的时间内删除链表节点.给定链表的头指针和待删除的节点指针,定义一个函数在O(1)的时间内删除该节点. 剑指offer的思路,顿时觉得极妙.删除节点node1,先把其下一个节点node2的内容复制到node1这个节点,然后把节点node1的指针指向node2的下一个节点,最后删除节点node2. 解题: def delete(link, node): if node.next: # 删除节点不是最后一个节点,此时链表也必不可能只有一个节点 p = node.next node.v…
在 O(1) 时间内删除链表节点 题目描述 在 O(1) 时间内删除链表节点. 方案:如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复杂度为 O(1).否则,就需要先遍历链表,找到节点的前一个节点,然后让前一个节点指向 null,时间复杂度为 O(N). 题目链接: 在 O(1) 时间内删除链表节点 代码 /** * 在 O(1) 时间内删除链表节点 */ public class Jz69 { /** * 方案: * 如果该节点…
题目:给定单向链表的头指针和一个结点指针,定义一个函数在o(1)时间删除该结点.链表结点与函数的定义如下:struct ListNode{       int m_nValue;       ListNode *m_pNext;    }void DeleteNode(Listnode** pListHead, ListNode* pToBeDeleted); 思路:将要删除的结点的下一个结点的值复制到要删除的结点,删除下一个结点.如果是要删除最后一个结点,则要从头开始搜索.   测试用例: 1…