描述
给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。
样例
Linked list is 1->2->3->4
, and given node 3
, delete the node in place 1->2->4
思路
给定链表中的一个节点,删除该节点。
正常情况下链表中节点的删除是需要知道被删除节点的前一个节点的,将它前一个节点的next指针指向它的下一个节点,这个节点就从链表中删除了。但是这里没有提供前一个节点,而是提供了当前节点。
一个技巧就是用它的下一个节点的值覆盖当前节点的值,然后将下一个节点删除掉,这样就等效删除了当前节点。但是需要注意这种方法不能删除尾节点
代码
1 <?php 2 //给定一个单链表中的一个等待被删除的节点(非表头或表尾) 3 class Node 4 { 5 public $value; 6 public $next = null; 7 8 public function __construct($value) 9 { 10 $this->value = $value; 11 } 12 } 13 14 /** 15 * 常规方法,从表头开始遍历找到待删除节点p以及待删除节点的上一个节点q 16 * q->value = p->next->value 17 * q->next = p->next 18 * 显然这种方式,时间复杂度为O(n) 19 * 然而该题只给了一个待删除的节点,并没有给表头,且要求时间复杂度为O(1) 20 * 思路:先把待删除节点替换为下一个节点,然后把下一个节点删除(若待删除节点为表尾的话,此方法不适用) 21 * 22 */ 23 function delete_node($node) 24 { 25 $tmp = $node->next; 26 $node->value = $tmp->value;//待删除节点的值,替换为下一个节点的值 27 $node->next = $tmp->next;//删除待删除节点的下一个节点 28 return $node; 29 } 30 31 32 $A = new Node(1); 33 $B = new Node(2); 34 $C = new Node(3); 35 $D = new Node(4); 36 37 $A->next = $B; 38 $B->next = $C; 39 $C->next = $D; 40 echo "<pre>"; 41 print_r(delete_node($C));