面试题18:删除链表的结点

题目:在O(1)时间内删除链表结点

在链表中删除一个结点有两种方法:

  1. 从链表头结点开始遍历整个链表,直到要删除的结点的前一个结点为止,此时使要删除结点的前一结点的next指针指向要删除结点的下一个结点,再删除要删除的结点
  2. 当要删除结点的不为尾结点时,直接将要删除结点的下一结点的值复制给要删除结点并同时将要删除结点的next指针指向下一结点的下一个结点

如下图所示:

 具体代码如下:

void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) {
	if (!pListHead || !pToBeDeleted)
		return;
	//删除节点不为尾节点
	if (pToBeDeleted->m_pNext != NULL) {
		ListNode* pNext = pToBeDeleted->m_pNext;
		pToBeDeleted->m_nKey = pNext->m_nKey;
		pToBeDeleted->m_pNext = pNext->m_pNext;
		delete pNext;
		pNext = nullptr;
	}
	//链表中只有一个结点时,删除头结点
	else if (*pListHead == pToBeDeleted) {
		delete pToBeDeleted;
		pToBeDeleted = nullptr;
		*pListHead = nullptr;
	}
	//链表中含有多个结点,且要删除的结点为尾结点,则删除尾结点
	else {
		ListNode* pNode = *pListHead;
		while (pNode->m_pNext != pToBeDeleted) {
			pNode = pNode->m_pNext;
		}
		pNode->m_pNext = nullptr;
		delete pToBeDeleted;
		pToBeDeleted = nullptr;
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值