(三)单链表和双链表在执行删除操作时的区别

原创 2012年03月26日 21:14:28

博客现已迁移到:http://henderyblog.sinaapp.com 欢迎访问

写双链表的删除操作时,一开始是采用单链表的方法。在执行的时候,删除非末尾节点还正常,但当删除的节点时最后一个节点时,执行时会返回位置(也就是指针)出错无法执行的情况。调试了好多次,也没找到原因。通过思考,最终找到了两者的区别,以下是两个操作的代码:

单链表删除:

Node *delete_element_list(Node *head,int i)
{
	Node *p;
	p=head;
	int j = 0;
	if(i>length(head)||i<1)
	{
		cout<<"error"<<endl;
		return NULL;
	}
	while(p->next&&j<i-1)
	{
		p=p->next;
		j++;
	}
	Node *q;
	q=p->next;
	p->next=q->next;
	free(q);
	return head;
}
双链表删除:

Node *deleteElement(Node *head,int i)
{
	if(i>length(head)||i<1)//错误的删除位置
	{
		cout<<"error!"<<endl;
		return NULL;
	}
	int j = 0;
	Node *temp;
	temp = head->next;
	while(j<i-1&&temp)
	{
		j++;
		temp = temp->next;
	}
	if(temp->next==NULL)
	{
		temp->prior->next=NULL;//此步骤是关键,在删除最后一个节点时,需要将其的prior改为尾节点
		free(temp);

	}
	else
	{
		/*temp为要删除的节点,将temp的prior指向temp的next
		temp的next的prior指向temp->prior
		*/
		temp->prior->next=temp->next;
		temp->next->prior=temp->prior;
		free(temp);
	}
	return head;
}
对于单链表,无需判断要删除的节点是否是尾节点。而对于双链表则需要判断。究其原因,单链表的节点直接只有一个next指针,在找到要删除的节点的前一个节点(temp)时直接将其next指向temp->next->next即可,若要删除的节点时尾节点,其指针则直接指向NULL,也就是temp直接变为最后一个节点操作成功。而对于双链表,若删除的节点是尾节点,这种方法显然是不行的。若已找到要删除的节点temp,它是尾节点,在执行temp->next->prior=temp->prior这一操作时显然会出错。因为temp->next的next为空,而NULL是没有prior的。也就是说需要提前判断一下要删除的节点是否是尾节点,若是则直接将temp->prior指向空,free(temp)即可。二者结构的不同决定了相应的操作也有差异。

得到的一点启示就是:写代码的时候要多考虑一些极限情况,对于上面的情况若删除的不是尾节点,则单链表的方法就可以解决两者。但是对于尾节点的情况就不同了。想的和做的差别真的很大,尤其是写代码。只有写的时候调试的时候一些隐藏的错误才会暴露出来。一句话:写代码要多“挑刺”。



两种双向链表的首项插入与删除效率比较

这里说的两种双向链表是指带“sentinel”与不带“sentinel”的,其中带"sentinel"的多了一个"sentinel"节点,以空间换取了时间。两种链表如下图: 1.不带sentinel的...
  • gaobohello1987
  • gaobohello1987
  • 2014年12月26日 15:21
  • 400

单链表,双链表,循环链表的区别

单向链表(单链表) 单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向表中的下一个节点,而最后一个节点则 指向一个空值NULL。 单向链表只可向一个方向遍历。查...
  • u012989536
  • u012989536
  • 2014年12月28日 19:22
  • 1880

单链表和双链表 算法与实现

链表是包含一些数据的独立数据结构(也成为节点)的集合,每个节点都是通过指针链接在一起的。通常节点是动态分配的。事实上,链表中的节点可以存在于内存中的各个地方。,所以在物理上是不是相邻并无影响。链表在数...
  • wanxiao009
  • wanxiao009
  • 2010年04月14日 11:56
  • 5201

单链表,双链表和循环链表之间的区别详解

链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每个节点里存到下一个节点的指针。由于不须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比顺序表O(logn)快...
  • zhongwen7710
  • zhongwen7710
  • 2014年09月06日 17:41
  • 7683

Java实现单链表和双链表

首先给出一个链表模型: 第一步:  创建空链表    第二步:创建头节点 第三部:创建尾节点 ...
  • zhongwen7710
  • zhongwen7710
  • 2014年09月15日 22:43
  • 2162

单链表和双链表在执行删除操作时的…

写双链表的删除操作时,一开始是采用单链表的方法。在执行的时候,删除非末尾节点还正常,但当删除的节点时最后一个节点时,执行时会返回位置(也就是指针)出错无法执行的情况。调试了好多次,也没找到原因。通过思...
  • huangleijay
  • huangleijay
  • 2013年09月11日 15:56
  • 598

单链表、双链表、循环链表总结

1.单链表(为升序链表,value按升序排列) #include #include typedef struct NODE { struct NODE *link; int valu...
  • SdustLiYang
  • SdustLiYang
  • 2012年01月12日 16:51
  • 3628

链表的创建、插入、删除操作

早上起来写的一个简单的链表的操作。今天是中秋节,祝大家中秋快乐,阖家团圆!   #include #include #include typedef struct St { i...
  • rongdeguoqian
  • rongdeguoqian
  • 2012年09月30日 09:27
  • 5871

详述线性表(单链表,双链表,静态链表和循环链表)

线性表:由零个或多个数据元素组成的有限序列。     关键点: 有限序列第一个元素有且仅有一个前驱结点,最后一个与元素有且仅有一个后继结点,中间元素有一个前驱结点和一个后继结点线性表可...
  • qq_26626709
  • qq_26626709
  • 2016年08月14日 12:29
  • 1133

数据结构——循环单链表和双向链表

1.循环单链表 1.循环单链表特点: 链表中最后一个结点的指针域不再是结束标志,而是指向整个链表的第一个结点,从而使链表形成一个环。和单链表相同,循环单链表也有带头结点和不带头结点两种。带头结点的...
  • xiaofei__
  • xiaofei__
  • 2016年03月25日 21:57
  • 2322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(三)单链表和双链表在执行删除操作时的区别
举报原因:
原因补充:

(最多只允许输入30个字)