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

来源:互联网 发布:unity3d游戏开发案例 编辑:程序博客网 时间:2024/05/12 15:57
<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;}


                                             
0 0