Delete Node in a Linked List

描述

给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在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));

 

转载于:https://www.cnblogs.com/573583868wuy/p/9440178.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值