一、常规删除方法 o(n)
算法:
1、不需改变链表结构
2、从头开始遍历结点,找到待删除结点的前一个结点。
二、O(1)
算法:
1、改变链表结构,并且不能是尾节点。给定要删除节点的地址。
2、不一定非得要找到被删除结点的前一个结点,可以很方便的找到待删除结点的下一个结点,将下一节点内容复制到待删除结点,删除下一节点即可。
3、如果是根据内容删除结点,则不能使用。
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
void DeleteNode(ListNode* head,ListNode* NodeToDelete){
if(head == NULL ||NodeToDelete == NULL)
return;
//删除结点不是尾节点
if(NodeToDelete->next!=NULL){
ListNode* pNext = NodeToDelete->next;
NodeToDelete->val = pNext->val;
NodeToDelete->next = pNext->next;
delete pNext;
pNext = NULL;
}
//删除结点是尾节点且也是头结点
else if(head == NodeToDelete)
{
delete NodeToDelete;
head = NULL;
NodeToDelete = NULL;
}
//是尾节点不是头结点
else{
ListNode *p = head;
while(head->next != NodeToDelete)
p = p->next;
p->next = NULL;
delete NodeToDelete;
NodeToDelete = NULL;
}
}
两种方法都需要注意:如果删除的是尾节点,需要指向NULL