题目13:在O(1)时间删除链表节点(leetcode链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/)
题目分析
方法1:时间复杂度O(N)
顺序遍历链表,找到要删除的链表节点以及前驱节点,让前驱节点的next指向要删除节点的next节点。
方法2:时间复杂度O(1)
将要删除的节点的next节点复制覆盖它的前驱节点(要删除的节点),在删除该节点。
代码描述
方法1
//leetcode代码
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
//遍历链表,找到节点并删除
ListNode* prev = NULL;
ListNode* curr = head;
//如果链表为空,直接返回,不进入循环
while(curr){
if(curr->val == val){
//如果要删除的节点时头结点,直接返回head->next
if(curr == head){
return head->next;
}
prev->next = curr->next;
break;
}
prev = curr;
curr = curr->next;
}
return head;
}
};
方法2
void deleteNode(ListNode** pListHead,ListNode* pToBeDelete)
{
//如果链表为NULL或者要删除的节点不存在(为NULL)。退出
if(*pListHead == NULL || pToBeDelete == NULL)
return;
//如果要删除的节点是最后一个节点或者链表中只有一个节点(删除的节点也是最后一个节点)
if(pToBeDelete->next == NULL)
{
//遍历链表,找到要删除的节点的前驱节点
ListNode* prev = NULL;
ListNode* curr = head;
while(curr)
{
//如果链表中只有一个节点(要删除的节点是第一个也是最后一个)
if(curr == pToBeDelete)
{
if(curr == head)
{
free(head);
head = NULL;
}
else
{
prev->next = curr->next;
free(curr);
curr = NULL;
}
break;
}
prev = curr;
curr = curr->m_Pnext;
}
}
else
{
//复制后一个节点的值到要删除的节点,删除要删除节点的next
pToBeDelete->m_nValue = pToBeDelete->m_Pnext->m_nValue;
pToBeDelete->next = pToBeDelete->next->next;
free(pToBeDelete);
pToBeDelete = NULL;
}
}