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

原创 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)即可。二者结构的不同决定了相应的操作也有差异。

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



双向链表的插入及删除图解

双向链表的插入第一步:首先找到插入位置,节点 s 将插入到节点 p 之前 第二步:将节点 s 的前驱指向节点 p 的前驱,即 s->prior = p->prior; 第三步:将节点 p 的前驱的...

单链表和双链表的基本操作实例

  • 2016年04月20日 14:03
  • 3.63MB
  • 下载

C/C++学习(九)循环双链表的操作之创建,插入、删除

双向链表 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是O(n)。如果希望从表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的每个结点里再增加一个指向其前驱的...

写给初学数据结构的同学之(循环双链表基本操作,创建,插入,删除,排序)

1.双向循环链表的创建:没什么好说的 NODE * Doublelinklist() { NODE *head = NULL; return head; } 2.插入节点:...

单链表插入删除区间操作

  • 2014年07月15日 23:07
  • 3KB
  • 下载

单链表的插入删除 遍历等操作

  • 2011年12月05日 13:33
  • 2KB
  • 下载

双链表的实现以及插入删除等操作

//...........DList.h #ifndef _LIST_H_ #define _LIST_H_ #include #include #include #include #define E...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(三)单链表和双链表在执行删除操作时的区别
举报原因:
原因补充:

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