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

原创 2015年07月07日 20:41:24

struct ListNode

{

       int  m_nValue;

       ListNode*  m_pNext;

};

void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);


        并不是一定需要得到被删除的结点的前一个结点,可以将被删除结点的后一个结点的内容复制到被删除结点,然后将后一个结点删除。


void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
{
if (!pListHead || !pToBeDeleted)
return;
if (pToBeDeleted->m_pNext != NULL)
{
ListNode* pNext = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = pNext->m_nValue;
pToBeDeleted->m_pNext = pNext->m_pNext;
delete pNext;
pNext = NULL;
}
//链表只有一个结点,删除头结点(也是尾结点)
else if(*pListHead == pToBeDeleted)
{
delete pToBeDeleted;
pToBeDeleted = NULL;
*pListHead = NULL;
}
//要删除的结点是尾结点
else
{
ListNode* pNode = *pListHead;
while (pNode->m_pNext != pToBeDeleted)
{
pNode = pNode->m_pNext;
}
pNode->m_pNext = NULL;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}


上面的解法有一个假设:要删除的结点的确在链表中。需要O(n)的时间才能判断链表中是否包含某一结点,受到O(1)的限制,不得不把确保结点在链表中的责任推给了函数DeleteNode的调用者。


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

/* copyright@nciaebupt 转载请注明出处 题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。 链表结点的定义如下: struct ListNode { i...

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

题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下: struct ListNode {       int        m_nKey;       List...

面试题13:在O(1)时间 内删除链表节点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。链表节点与函数的定义如下: struct ListNode { int value; ListNode*...

从N个不同数字中等概率取出M个数字(N>=M)

这个问题本身不难理解,但是关键的地方是理解等概率,还有一个隐性的条件,那就是不能重复取。所以初步的想法是用Rand()在[0,N]范围内生成M个随机数字,万一里面有重复数字,那这就不好玩了。为了避免重...

操作系统内存管理——分区、页式、段式、段页式管理

1. 内存管理方法         内存管理主要包括虚地址、地址变换、内存分配和回收、内存扩充、内存共享和保护等功能。  2. 连续分配存储管理方式       连续分配是指为一个用户程序分配...

[经典面试题]在O(1)时间删除链表结点

【题目】 给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下: struct ListNode {     int        value;     struc...

剑指offer--面试题13:在O(1)时间删除链表结点--Java实现

题目描述: 在给定的单向列表的头指针和一个结点指针,定义在一个函数在O(1)时间删除该结点。解题思路: 一般单向列表删除结点,就是从头遍历,找到这个结点之前的结点,指向这个结点之后的结点,就算是删...

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

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(l)时间删除该结点。链表结点与函数的定义如下: struct ListNode{ int m_nValue; ListNode *m_p...

剑指offer--面试题13:在O(1)时间删除链表结点

#include #include typedef struct node { int data; struct node *next; }Node,*LinkList; LinkList C...

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

方法一:顺序查找要删除的结点,并在链表中删除。时间复杂度为O(n),不满足题目要求 代码: void DeleteNode(ListNode **pListHead, ListNode *pToBeD...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在O(1)时间删除链表结点
举报原因:
原因补充:

(最多只允许输入30个字)