用O(1)时间,删除一个链表节点(3)
2017-08-31 22:52
246 查看
ListCommon.h,ListCommon.cpp依赖:
链表基本操作的函数实现。(1)
有这样一个问题,给定一个单向链表的头结点pHead和要删除的节点pDeleted,但是要求在O(1)时间完成。
可能先想到的就是从头结点往前遍历,找到要删除的节点pDeleted,这样就知道了它的前后节点,但是这样的时间是O(n)。
这里的思路是:
把pDeleted的下一个节点pNode1的值赋给pDeleted,同时让pDeleted指向pNode2,然后把pNode1删掉,pDeleted就不删了,这样就不用从头遍历了。
其中有2个特殊情况,1)整个链表只有一个节点,2)要删除的节点是尾节点,这两种情况要特殊处理。
DeleteListNode.cpp
#include <iostream> #include "ListCommon.h" using namespace std; void deleteListNode(ListNode** pHead, ListNode* pDeleted){ if(pHead == NULL || pDeleted == NULL){ return; } cout << "before delete node:"<<endl; PrintList(*pHead); //删除的节点不是头结点,也不是尾节点 if(pDeleted->m_pNext != NULL){ ListNode* pNext = pDeleted->m_pNext; pDeleted->m_nValue = pNext->m_nValue; pDeleted->m_pNext = pNext->m_pNext; delete pNext; pNext = NULL; //删除的是头部节点,这时头结点就被改变了,所以这里的pHead是指向指针的指针。 }else if(*pHead == pDeleted){ delete pDeleted; pDeleted = NULL; pHead = NULL; }else{ //删除的是尾部节点,先找到它的前一个节点,然后把这个pDeleted节点删掉。 ListNode* pNode = *pHead; while(pNode->m_pNext != pDeleted){ pNode = pNode->m_pNext; } pNode->m_pNext = NULL; delete pDeleted; pDeleted =NULL; } cout << "after delete node:"<<endl; PrintList(*pHead); } int main(int argc, char* argv[]){ ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1,pNode2); ConnectListNodes(pNode2,pNode3); ConnectListNodes(pNode3,pNode4); ConnectListNodes(pNode4,pNode5); deleteListNode(&pNode1,pNode3); }
测试结果:
PC:~/algorithm$ g++ ListCommon.cpp DeleteListNode.cpp -o
4000
DeleteListNode
PC:~/algorithm$ ./DeleteListNode
before delete node:
print list begin ---
1
2
3
4
5
print list end
after delete node:
print list begin ---
1
2
4
5
print list end
相关文章推荐
- 13 在O1的时间删除链表节点-使用一个节点指针
- 单向链表在O(1)时间内删除一个节点
- 在O(1)的时间内删除链表的一个节点
- 单向链表在O(1)时间内删除一个节点
- 13:在O(1)时间内删除单向链表中的一个节点
- O(1)时间内删除单向链表中的一个节点
- 编写一个程序,实现删除链表中倒数第k个节点(用单链表实现)
- 13、在O(1)时间删除链表节点
- 在O(1)时间复杂度删除链表节点
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 剑指offer13:O(1)时间删除链表节点
- 372. 在O(1)时间复杂度删除链表节点--java
- 剑指offer13-在O(1)时间删除链表节点
- 给定一个单向链表,目前已经有一个指针,指向某一个节点(记作A),现在要删除这个节点A,如何操作。
- 建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
- day05删除一个无头单链表的非尾节点 +从尾到头打印单链表+复杂链表的复制
- 数据结构:设有一个不带头结点的单链表L,设计两个递归算法,del(L,x)删除单链表L中第一个值为x的节点,delall(L,x)删除单链表L中的最小节点值。
- 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
- Lintcode 372. O(1)时间复杂度删除链表节点