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

被折叠的 条评论
为什么被折叠?



