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

在O(1)时间删除链表节点

时间:2016-05-09 07:21:52      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:在o(1)时间删除链表节点


思路:

时间复杂度要求为O(1),已知要删除的节点,可以找到该节点的下一个节点,把下一个节点的相关信息复制到要删除的节点上,删除下一个节点,可以达到题目要求。

注意:删除尾节点时需要遍历一遍,删除头结点时,需要把头结点移到下一个节点。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

struct Listnode
{
	int _value;
	Listnode* _next;
};
void Init(Listnode*& head)
{
	Listnode* cur =head;
	if(cur==NULL)
	{
		cur=(Listnode*)malloc(sizeof(Listnode));
		cur->_next=NULL;
		cur->_value=0;
	}
	head=cur;
}

void push(Listnode*& head,int value)
{
	Listnode* cur =head;

		while(cur->_next)
		{
			cur=cur->_next;
		}
		Listnode* tmp=NULL;
		tmp=(Listnode*)malloc(sizeof(Listnode));
		tmp->_next=NULL;
		tmp->_value=value;
		cur->_next=tmp;
	
		

}
void pop(Listnode* head)
{
	Listnode* cur=head;
	Listnode* prev=NULL;
	while(cur->_next!=NULL)
	{
		prev=cur;
		cur=cur->_next;
	}
	prev->_next=NULL;
	free(cur);
	cur=NULL;
}
void print(Listnode* head)
{
	Listnode* cur=head;
	while(cur)
	{
		printf("%d\n",cur->_value);
		cur=cur->_next;
	}
}
Listnode* Find(Listnode* head,int value)
{
	assert(head);
	Listnode* cur=head;
    while(cur)
	{
		if(cur->_value==value)
		{
			return cur;
		}
		else
		{
			cur=cur->_next;
		}
	}
}
void DeleteNode(Listnode* &head,Listnode* pToBeDeleted)
{
	Listnode* cur=head;
	if(cur==NULL)
	{
		return;
	}
	if(pToBeDeleted==head)
	{
		head=cur->_next;
		free(cur);
		cur=NULL;
		return;
	}
	Listnode* last=pToBeDeleted->_next;
	if(last!=NULL)
	{
		pToBeDeleted->_value=last->_value;
		pToBeDeleted->_next=last->_next;
		free(last);
		last=NULL;
	}
	else    //删除的是尾节点
	{
		Listnode* prev=NULL;
		while(cur->_next!=NULL)
		{
			prev=cur;
			cur=cur->_next;
		}
		prev->_next=NULL;
		free(cur);
		cur=NULL;
	}
}
void test()
{
	Listnode* head=NULL;
	Init(head);
    push(head,1);
	push(head,2);
	push(head,3);
	/*pop(head);*/
	print(head);
	Listnode* tmp=Find(head,1);
	DeleteNode(head,head);
	print(head);

}
int main()
{
	test();
	system("pause");
	return 0;
}

结果:

技术分享

技术分享



本文出自 “liveyoung” 博客,转载请与作者联系!

在O(1)时间删除链表节点

标签:在o(1)时间删除链表节点

原文地址:http://10707042.blog.51cto.com/10697042/1771251

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