链表题目集合一(删除结点)

1、删除链表的头结点:

题目:给定链表的头指针和一个结点指针,在O(1)时间内参数该结点。

思路:我曾经在《编程之美》上看过这道题目,当时对于书上所给的那种"狸猫换太子"的做法非常的诧异,同时也让我在解题的时候有了另外一种思路;

但是最近又在复习和巩固知识:发现这个题目并没有书上说的那么简单(书上可能省略了一些边界条件等等)。

void deleteNode(LinkNode<T> *pHeader, LinkNode<T> *p)
{
	//当然前面还要对pHeader进行完整性校验.....

	if (p == pHeader)
	{
		//考虑删除的结点是头结点(这个必须单独考虑)
	}
	else
	{
		//如果删除的这个结点是链表的尾结点,这个时候我们需要遍历链表找到p的前驱
		if(p->next == NULL)
		{
			//处理
		}
		else
		{
			//这个时候可以采用《编程之美》上面说的很令我诧异的"狸猫换太子"的做法
			//处理
		}
	}

}
这里我们可能会看到一个问题:如果删除的结点是链表的尾部,没有下一个节点 ,我们仍然从链表的头结点开始,顺序遍历得到给定结点的前驱节点,并完成删除操作。这个时候时间复杂度是O(n),是不是就不符合题目的要求呢?

下面有人这样分析:

实际上,假设链表总共有n个节点,我们的算法在n-1总情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度是O(n)。那么平均时间复杂度是[(n-1)*O(1)+O(n)]/n,仍然为O(1)。

参考文献:http://blog.csdn.net/wcyoot/article/details/6426691

待以后再详细写代码!

你可能感兴趣的:(链表题目集合一(删除结点))