在O(1)时间删除链表节点
来源:互联网 发布:红外万能遥控器软件 编辑:程序博客网 时间:2024/06/18 11:31
问题:给定一个单项链表的头指针和一个结点指针,定义一个函数在O(1)的时间删除该节点。算法实现如下:
#include "stdafx.h"#include "..\Utilities\List.h"//在平均O(1)时间删除结点的算法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; }}// ====================测试代码====================void Test(ListNode* pListHead, ListNode* pNode){ printf("The original list is: \n"); PrintList(pListHead); printf("The node to be deleted is: \n"); PrintListNode(pNode); DeleteNode(&pListHead, pNode); printf("The result list is: \n"); PrintList(pListHead);}// 链表中有多个结点,删除中间的结点void Test1(){ 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); Test(pNode1, pNode3); DestroyList(pNode1);}// 链表中有多个结点,删除尾结点void Test2(){ 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); Test(pNode1, pNode5); DestroyList(pNode1);}// 链表中有多个结点,删除头结点void Test3(){ 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); Test(pNode1, pNode1); DestroyList(pNode1);}// 链表中只有一个结点,删除头结点void Test4(){ ListNode* pNode1 = CreateListNode(1); Test(pNode1, pNode1);}// 链表为空void Test5(){ Test(NULL, NULL);}int _tmain(int argc, _TCHAR* argv[]){ Test1(); Test2(); Test3(); Test4(); Test5(); return 0;}运行结果如下:
0 0
- 在O(1)时间删除链表节点
- 在O(1)时间删除链表节点
- 在O(1)时间删除链表的节点
- 在O(1时间删除链表节点
- 在O(1)时间删除链表节点
- 剑指offer13-在O(1)时间删除链表节点
- 在O(1)时间删除链表节点
- 题目:在O(1)时间复杂度删除链表节点
- LintCode-在O(1)时间复杂度删除链表节点
- lintcode 在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- 在O(1)时间删除链表节点
- LintCode:在O(1)时间复杂度删除链表节点
- LintCode_372_在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- 在O(1)时间复杂度删除链表节点
- 在O(1)时间删除链表节点13
- jquery通过ajax-json访问java后台传递参数,通过request.getParameter获取不到参数的说明
- Android开发——EditText编辑框设计一个登录页面
- UGUI—Button功能的实现
- 产品经理的核心价值和工作边界
- ubuntu桌面进不去——解决办法
- 在O(1)时间删除链表节点
- 设计模式-创建型模式:抽象工厂 AbstractFactory
- 分布式文件系统,独立mds与无独立mds优缺点比较
- 15-数组逆序
- 调整数组顺序使奇数位于偶数前面
- 如何获取APP上面的所有图片(iOS Images Extractor)
- 给公司代码分配信贷控制范围
- RabbitMQ学习之集群镜像模式配置
- 快速排序