码迷,mamicode.com
首页 > 其他好文 > 详细

删除单链表某个结点

时间:2015-01-13 17:47:09      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:删除结点   单链表删除结点   删除某个结点   单链表删除   结点   

题目:删除带头结点的单链表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;

}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置为空,防止它成为野指针
}

拓展:如果删除的结点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=q->data;
	    p->next=q->next;//从单链表中删除结点q

	    free(q);//释放结点q
	    q=NULL;//将结点q置为空,防止它成为野指针
	
	}
	else //如果p是最后一个结点
	{
		LNode* pre=L;//用pre表示p的前驱结点
		while(pre->next) //保持pre有后继结点
		{
			if(pre->next==p)//如果pre是p的前驱结点
			{
				pre->next=p->next;//将结点p从单链表中删除
				free(p);//释放结点p
	            p=NULL;//将结点p置为空,防止它成为野指针
			}
		}
		if(!p) //p不为空,说明p不在单链表L中
		{
			return;
		}
	}
	
}


删除单链表某个结点

标签:删除结点   单链表删除结点   删除某个结点   单链表删除   结点   

原文地址:http://blog.csdn.net/lavor_zl/article/details/42678371

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!