给定链表的头指针和一个结点指针,在O(1)时间删除该结点

题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。

具体思路:把头结点的数据直接copy到要删除的结点处,然后头指针向后移动一个结点,再free掉原来的头指针指向的结点,这样等于把要删除的结点删除了。当链表只有一个结点或者要删除的结点是头结点或尾结点时,这种方法也是成立的,所以不需要做特殊的处理。假设链表总共有n个结点,我们的算法在n-1总情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度为O(n)。那么平均时间复杂度[(n-1)*O(1)+O(n)]/n,仍然为O(1),所以满足条件。

具体代码省略……

给定链表的头指针和一个结点指针,在O(1)时间删除该结点

时间: 2024-10-06 02:51:00

给定链表的头指针和一个结点指针,在O(1)时间删除该结点的相关文章

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

#include <iostream> #include <string.h> #include <stdlib.h> #include <stack> using namespace std; struct Node { int data; struct Node* next; }; struct Node* create_list(int len) { if (len <= 0) return NULL; struct Node* head; st

每天一个小算法(4)----在O(1)时间删除指定结点

O(1)时间内删除结点的思路只能是复制该结点下一个结点的数据,然后删除该结点的下一个结点,来等效删除此结点. 需要注意的地方是删除头结点和尾结点的处理. 1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 typedef struct Node 5 { 6 int data; 7 Node* next; 8 }Node, *List; 9 10 List createList(int num)

在O(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 思路:我们可以很方便的得到要删除的结点的下一结点,如果我们把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除.就相当于把当前需要删除的

在O(1)时间删除链表结点——13

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 因为要求时间复杂度为O(1),所以肯定不能遍历链表,那样的话时间复杂度就是O(N)了:可以想到,其实要求删除该结点,真正的目的并不是要将结点的数据包括结点所占的内存都给删除,只是想让数据消失就可以了,至于结点,除去任意一个结点所占的空间都是OK的: 所以,这里换一种思路,若要删除指定的结点,一般需要将前一个结点的next指针指向要删除结点的下一个结点,这样要删除的结点就可以脱离链表而被删除了,但这里关键就是即是单链表没有

在O(1)的时间删除链表结点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除节点.链表结点与函数的定义如下: struct ListNode {     int m_nValue;     ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 分析:要删除结点i,先把i的下一个节点j的内容复制给i,然后把i的指针指向结点j的下一个结点.此时再删除结点j,其效果相当于把结点i删除了. 上

33.在O(1)时间删除链表结点

http://zhedahht.blog.163.com/blog/static/254111742007112255248202/ 题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 分析:这是一道广为流传的Googl

O(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: typedef struct ListNode { int val; struct ListNode *p_next; }NODE, *PNODE; void delete_node(PNODE *pListHead, PNODE pToDeleted); 一般来说,我们拿到一个删除链表的某个结点的题目,最常规的解法无疑是从链表的头结点开始顺序遍历,依次查找要删除的结点,找到被删除结点的前

在O(1)时间删除链表结点

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; code: //把待删结点后面一个结点的值赋给待删结点,然后把待删结点next指针指向下下个结点,然后删除下个结点, 达到和删除待删结点一样的效果. void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) { if (!pL

面试题18(一):在O(1)时间删除链表结点

// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点.链表结点与函数的定义如下: // struct ListNode{ // int m_nValue; // ListNode* m_pNext; // }; // void deleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 解题思路: 这是目前为止,唯一一道,我不看书就知道怎么做的题. 正