题目:删除带头结点的单链表L中的结点p,p不是最后一个结点,要求时间复杂度为O(1)。
解题思路:
如果不要求时间复杂度为O(1),我们可以找出p的前驱结点,然后很容易就删除p。
现在要求时间复杂度为O(1),因为p不是最后一个结点,知道结点p我们可以删除p的后继结点,那么我们可以把p的后继结点元素的值赋给p结点元素的值。
ADT定义如下
#define ElemType int
typedef struct LNode{
ElemType data;
LNode *next;
解题思路:
如果不要求时间复杂度为O(1),我们可以找出p的前驱结点,然后很容易就删除p。
现在要求时间复杂度为O(1),因为p不是最后一个结点,知道结点p我们可以删除p的后继结点,那么我们可以把p的后继结点元素的值赋给p结点元素的值。
ADT定义如下
#define ElemType int
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;
算法实现:
void deleteNode(LNode* &p)
{
if(p==NULL||p->next==NULL) return;//如果p为空或为单链表中最后一个结点不符合题意,直接返回
LNode* q=p->next;//q为p的后继结点
p->data=q->data;
p->next=q->next;//从单链表中删除结点q
free(q);//释放结点q
q=NULL;//将结点q置为空,防止它成为野指针
}