算法题:O(1)时间删除单链表中某节点
顺便复习一下C++/Java的传参问题。
普通的删除单链表某节点,需要遍历找到该节点的前驱节点,时间复杂度为O(n),O(1)时间复杂度的算法如下:
(1)如果该链表只有一个节点,则删除该节点
(2) 如果删除的节点是尾节点,则遍历找到倒数第二个节点,再删除尾节点。
(3) 如果该链表不止一个节点,删除的也不是尾节点,则将要删除的节点的后继节点覆盖要删除的节点,再删除此后继节点。
链表结构如下:
typedef struct LNode {
int data;
struct LNode* next;
}ListNode, *LinkList;
打印链表:
void printList(LinkList L)
{
if (L == nullptr) return;
LinkList p = L->next;
while (p)
{
cout << p->data<<" ";
p = p->next;
}
}
删除函数:
void DeleteNode(ListNode* pListHead, ListNode* &pToBeDeleted)
{
if (pListHead == NULL || pToBeDeleted == NULL) return;
//这个