剑指offer-面试题18-删除链表的节点-链表

/*
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。
*/
/*
思路:
	将要删除的节点的下一个节点的value和next复制过来,删除下一个节点。
	考虑两种特殊情况:
		节点为尾结点,则需要从头遍历。
		节点既是尾结点也是头结点,需要将头节点指向的内容置为空。
*/
struct ListNode{
	int value;
	ListNode* next;
};

void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted){
	if(!pListHead || !pToBeDeleted){
		throw("invalid parameters");
	}
	//要删除的节点既是头结点,又是尾结点
	if(*pListHead== pToBeDeleted && !pToBeDeleted->next){
        *pListHead = nullptr;
        delete pToBeDeleted;
        pToBeDeleted = nullptr;
	}else if(!pToBeDeleted->next){//要删除的节点是尾结点if

		ListNode* pNode = *pListHead;
		while(!pNode->next->next){
			pNode = pNode->next;
		}
		pNode->next = nullptr;
        delete pToBeDeleted;
		pToBeDeleted = nullptr;
	}else{
        ListNode *nextNode = pToBeDeleted->next;
        pToBeDeleted->value = nextNode->value;
        pToBeDeleted->next = nextNode->next;
        delete nextNode;
        nextNode = nullptr;
	}

}

   

猜你喜欢

转载自www.cnblogs.com/buaaZhhx/p/11876852.html