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

[题目] 给定链表的头指针和一个结点指针.在O(1)时间删除该结点.链表结点的定义例如以下: struct ListNode { int        value; struct ListNode*  next; }; 函数的声明例如以下: void DeleteNode(ListNode* head,ListNode* node); [思路] 这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解. 在链表中删除一个…
题目:给定单向链表的头指针和某结点指针,实现函数在O(1)时间内删除指定节点. 思路:由于没有要删除结点(j结点)的前一个结点(i结点)指针,通常想法是从头开始遍历找到指定结点的前一个结点(i结点),然后使i结点的指针指向j结点的后一个结点k结点.但是这样是O(n)的时间复杂度,不符合要求. 解决方法很巧妙:由于有要删除的j结点的指针,因此可以很容易得到j结点的后一个结点k结点的指针,只要把k结点的内容复制给i结点,然后删除k结点即可. 但是要注意!如果链表只有一个结点,head指针要指NULL…
[面试题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)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在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)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在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…
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: 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_pNext;    }void DeleteNode(Listnode** pListHead, ListNode* pToBeDeleted); 思路:将要删除的结点的下一个结点的值复制到要删除的结点,删除下一个结点.如果是要删除最后一个结点,则要从头开始搜索.   测试用例: 1…
题目:给定单向链表的头指针和一个结点指针,定义一个函数在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; }; 分析:如下图所示,假设要删除的结点为p结点,若直接删除p结点,则必须知道p的上一个结点,而查找p的上一个结点的时间复杂度为O(N).可以交换p和p的下一个结点q的数据,然后直接删除q,这样便保证了时间复杂度为O(1).需要注意的是p为尾结点的情况.这时只能顺序遍历链表并完成删除操作. ListNo…
[题目] 给定链表的头指针和一个结点指针,在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)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 思路:我们可以很方便的得到要删除的结点的下一结点,如果我们把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除.就相当于把当前需要删除的…
//给定单向链表的头指针和一个结点指针,定义一个函数在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) {…
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 给定单向链表的头指针和一个结点指针,定义一个函数在 O(1) 时间删除该结点.链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted); 算法设计思想 通常,在单向链表…
问题描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. package Problem13; /* * 问题描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. * */ //定义结点的结构 class ListNode { ListNode nextNode; int nodeValue; } public class DeleteNode { public static void deleteNode(ListNode head, L…
地址 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…
点击查看代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: void deleteNode(ListNode* node) { node->val = node->next->val; node->ne…
package offer; //在 O(1)时间删除链表结点 public class Problem13 { public static void main(String[] args) { ListNode node1 = new ListNode(); ListNode node2 = new ListNode(); ListNode node3 = new ListNode(); ListNode node4 = new ListNode(); node1.nextNode = nod…
下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点.具体示例程序如下: //O(1)时间删除链表节点,从无头单链表中删除节点 void deleteRandomNode(Node *cur) { assert(cur != NULL); assert(cur->next != NULL); //不能是尾节点 Node* pNext = cur->n…
/** * 在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…
///////////////////////////////////////////////////////////////////////////////////// // 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)时间内删除该结点.链表结点与函数的定义如下: struct ListNode{ int val; ListNode* next; }; void deleteNode(ListNode** pListHead,ListNode* pToBeDeleted) 思路: 删除链表结点的一般思路是:从头指针开始遍历,找到要删除结点的前一结点pPrev,然后pPrev->next=pToBeDeleted->next,(还需考虑删除结点…
60.在 O(1)时间内删除链表结点(链表.算法).题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点.链表结点的定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 思路:把当前结点的下一个结点的内容复制到当前结点,删除下一结点即可. 注意,链表中只有一个结点时在题目给定的函数声明下无法删除,…
题目要求: 给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 参考资料:剑指offer第13题. 题目分析: 有几种情况: 1.删除的结点是头结点,且链表不止一个结点: 2.删除的结点是头结点,且链表只有一个结点: 3.删除的结点是尾结点,且链表不止一个结点: 4.删除的结点不是头也不是尾结点: 对于第四种情况(普遍情况),见如下图分析: 对于第三种情况,时间复杂度为O(n).其他情况时间复杂度为O(1).则总的平均复杂度为[(n-1)*O(1)+O(n)]/n = O(1). 代码实…
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 思路:将待删除节点下一个节点的数据赋给当前节点.删除下一个节点就可以.…
Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Given linked list -- head = [4,5,1,9], which looks like following: Example 1: Input: head = [,,,], node = Output: [,,] Explanation: You are g…