在O(1)平均时间删除链表结点

本文介绍了一种在O(1)平均时间内删除链表中指定节点的方法。通过交换被删除节点与其后继节点的值并调整指针连接,实现高效删除操作。特别地,针对待删节点为链表尾部的情况提供了额外解决方案。

问题:

给定链表的头指针和一个节点指针,在O(1)平均时间删除该节点。

分析:
我们可以从链表的头节点开始,顺序查找要删除的节点,找到之后再删除。即更新被删除节点的前一个节点的next值。由于需要顺序查找,时间复杂度自然就是O(n) 了。

本文采用另一种方法:因为我们知道被删除节点的指针,所以,我们可以得到被删除节点的下一个节点,然后交换被删除节点和它下一个节点的值,然后让“被删除”节点指向它下一个节点的下一个节点,这样,其实就是把“被删除”节点的下一个节点给删除掉了。这样做,复杂度是O(1). 但是,如果被删除节点是最后一个节点,我们必须用头节点开始遍历找到被删除节点的上一个节点。

void deleteNode(Node head, Node nodeDeleted) {
	if(head = null || nodeDeleted == null) return;

	// if nodeDeleted is not the last node in the list
	if(nodeDeleted.next != null) {
		// copy data from the node next to nodeDeleted
		nodeDeleted.value = nodeDeleted.next.value;
		nodeDeleted.next = nodeDeleted.next.next;
	} else {// if pToBeDeleted is the last node in the list
		// get the node prior to nodeDeleted
		Node node = head;
		while(node.next != nodeDeleted) {
			node = node.next;            
		}
		// deleted pToBeDeleted
		node.next = null;
	}
} 

class Node {
	char value;
	Node next;
}
参考:

http://zhedahht.blog.163.com/blog/static/254111742007112255248202/

转载请注明出处:http://blog.youkuaiyun.com/beiyetengqing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值