首页 > 代码库 > 删除单链表某个结点
删除单链表某个结点
题目:删除带头结点的单链表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=http://www.mamicode.com/q->data;>
拓展:如果删除的结点p可能是最后一个结点,怎么办。
解题思路:此时只能保证删除结点的平均时间复杂度为O(1),当p不是最后一个结点,时时间复杂度为O(1),当p是最后一个结点时,时间复杂度为O(n)。
算法实现:void deleteNode(LinkList &L,LNode* &p) { if(p==NULL||L==NULL) return;//如果p为空或单链表L为空不符合题意,直接返回 if(p->next) //如果p不是最后一个结点 { LNode* q=p->next;//q为p的后继结点 p->data=http://www.mamicode.com/q->data;>删除单链表某个结点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。