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

#include "List.h"
#include 
#include 

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;
	}
}


 
  
/*
	 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;
}


 
 

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