【剑指】18(1).在O(1)时间删除链表结点

题目描述

  • 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点,返回新链表的头节点;
  • PS:本题无提交

算法分析

  • 若被删除的节点为第一个节点,则直接将头节点指向下一个节点;
  • 若被删除的节点不是第一个节点,则沿着链表遍历每一个节点,直到找到该节点currNode,使preNode->next = currNode->next,并释放该节点。

提交代码:

class Solution{
public:
	ListNode* DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted)
	{
		if (!pListHead || !pToBeDeleted)
			return pListHead;

		/*如果被删除节点为第一个节点*/
		if (pToBeDeleted == pListHead)
		{
			pListHead = pListHead->next;
			delete pToBeDeleted;
			pToBeDeleted = nullptr;
		}
		else
		{
			ListNode* preNode = pListHead;
			ListNode* currNode = pListHead;
			while (currNode)
			{
				if (currNode == pToBeDeleted)
				{
					preNode->next = currNode->next;
					delete pToBeDeleted;
					pToBeDeleted = nullptr;
					break;
				}
				else
				{
					preNode = currNode;
					currNode = currNode->next;
				}
			}
		}

		return pListHead;
	}
};

测试代码:

// ====================测试代码====================
ListNode* Test(ListNode* pListHead, ListNode* pNode)
{
	printf("The original list is: \n");
	PrintList(pListHead);

	printf("The node to be deleted is: \n");
	PrintListNode(pNode);
	Solution s;
	pListHead = s.DeleteNode(pListHead, pNode);

	printf("The result list is: \n");
	PrintList(pListHead);
	return 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);

	pNode1 = 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);

	pNode1 = Test(pNode1, pNode1);

	DestroyList(pNode1);
}

// 链表中只有一个结点,删除头结点
void Test4()
{
	ListNode* pNode1 = CreateListNode(1);

	pNode1 = Test(pNode1, pNode1);
}

// 链表为空
void Test5()
{
	Test(nullptr, nullptr);
}

int main(int argc, char* argv[])
{
	Test1();
	Test2();
	Test3();
	Test4();
	Test5();

	return 0;
}


猜你喜欢

转载自blog.csdn.net/ansizhong9191/article/details/80652934
今日推荐