关闭

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

标签: nulldeletelistqq
3033人阅读 评论(0) 收藏 举报
分类:

博客现已迁移到: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)即可。二者结构的不同决定了相应的操作也有差异。

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34263次
    • 积分:521
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:4篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论