13\给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点,
2015-11-26 15:25
441 查看
<pre name="code" class="cpp">#include "List.h" #include <stdio.h> #include <stdlib.h> ListNode* CreateListNode(int value) { ListNode* pNode = new ListNode(); pNode->m_nValue = value; pNode->m_pNext = NULL; return pNode; } void ConnectListNodes(ListNode* pCurrent, ListNode* pNext) { if(pCurrent == NULL) { printf("Error to connect two nodes.\n"); exit(1); // exit(0)表示正常退出 // exit(1)表示异常退出.这个1是返回给操作系统的。 } pCurrent->m_pNext = pNext; } void PrintListNode(ListNode* pNode) { if(pNode == NULL) { printf("The node is NULL\n"); } else { printf("The key in node is %d.\n", pNode->m_nValue); } } void PrintList(ListNode* pHead) { printf("PrintList starts.\n"); ListNode* pNode = pHead; while(pNode != NULL) { printf("%d\t", pNode->m_nValue); pNode = pNode->m_pNext; } printf("\n PrintList ends.\n"); } void DestroyList(ListNode* pHead) { ListNode *pNode = pHead; while(pNode != NULL) { pHead = pHead->m_pNext; delete pNode; pNode = pHead; } }
<pre name="code" class="cpp">/* main Definition Created by taotao man on 2015-11-10 brief: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点,链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode *m_pNext; }; void DeleteNode(ListNode **pListHead, ListNode * pToBeDeleted); date: 2015-11-10 // 修改记录: add SetA(); Change GetA(); */ #include "stdafx.h" #include "List.h" 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 argv, _TCHAR* argc) { // Test1(); // Test2(); // Test3(); // Test4(); Test5(); return 0; }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- PHP5历史以及各个版本的新功能和新特性收集总结
- 中层管理者存在的6个员工培训观念误区
- App性能优化
- jQuery
- 打patch的方法
- 大型分布式网站架构技术总结
- JS版获取最长公共子串的方法
- 分发器自增锁的问题
- iso中输入框被软键盘覆盖的解决方案
- Bugtags 与其它产品的区别
- java Socket用法详解
- Nginx平滑重启
- jquery 更换皮肤
- centos7 yum安装kubernetes 1.1
- expect 打开文件
- Android应用数字签名详解
- 解密jQuery事件核心 - 自定义设计(三)
- 分享:基于神经网络的Visual C++阿拉伯数字训练和识别程序
- Service类onStartCommand()的三个返回值