zoukankan      html  css  js  c++  java
  • 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));
  • 相关阅读:
    跨平台编译ceres for Android
    解决OpenCV JavaCameraView相机preview方向问题
    OpenCV 4.0.1 找不到R.styleable解决
    mumu模拟器安装xposed--如何在android模拟器上进行root
    Windows编译OpenCV4Android解决undefined reference to std错误
    Skeleton with Assimp 骨骼动画解析
    Android GL deadlock timeout error
    Android device debug (adb) by Charge Only mode
    Firefox 多行标签的解决方案分享
    Linux 工程向 Windows 平台迁移的一些小小 tips
  • 原文地址:https://www.cnblogs.com/573583868wuy/p/9440178.html
Copyright © 2011-2022 走看看