高效删除链表中节点

在时间复杂度为O(1)、空间复杂度为O(1)的情况下,删除单向链表中节点。

大众思维:找到给出要删除节点的前一个节点,将前一个节点指向要删除节点的下一个节点,再释放删除节点的空间。但是,时间复杂度O(n),空间复杂度O(1)。

逆向思维:将给出的待删除节点指向待删除节点的下一个的下一个节点,并将下一个节点中的数据复制到待删除节点中,再释放待删除节点的下一个节点。变相的等于删除了待删除节点的下一个节点。满足时间复杂度和空间复杂度。

代码如下:


//Node Class

package LinkList;

public class Node {
    public int val;
    public Node next;
    
    public Node() {
        // TODO Auto-generated constructor stub
        this.val = new Integer(-1);
        this.next = null;
    }
    
}


//main
package LinkList;

import org.omg.CORBA.FREE_MEM;

public class DeleteNode {
    public void deleteNode(Node deleteNode) {
        deleteNode.val = deleteNode.next.val;
        deleteNode.next = deleteNode.next.next;
        //释放多余节点
        
    }
    public static void main(String[] args) {
        Node node[];
        node = new Node[10];
        for (int i = 0; i < node.length; i++) {
            node[i] = new Node();
        }
        for(int i=0;i<9;i++){
            node[i].val = i;
            node[i].next = node[i+1];
        }
        node[9].next = node[7];
        node[9].val = 9;
        
        for (int i = 0; i < node.length; i++) {
                System.out.println(node[i].val + ":" + node[i].next.val);
        }
        
        new DeleteNode().deleteNode(node[7]);
        
        for (int i = 0; i < node.length; i++) {
            System.out.println(node[i].val + ":" + node[i].next.val);
        }
        
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,243评论 0 12
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,412评论 0 25
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • 一.线性表 定义:零个或者多个元素的有限序列。也就是说它得满足以下几个条件:  ①该序列的数据元素是有限的。  ②...
    Geeks_Liu阅读 2,718评论 1 12
  • 晴日暖风拂山岗,植木丛深夏日长。 绿荫幽草麦田香,子粒未满待灌浆。 夕阳晚照映红黄,清净绝尘望野荒。 诗酒共醉一夏...
    打油叔阅读 292评论 0 0