博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer:面试题13——在O(1)时间删除链表结点
阅读量:4946 次
发布时间:2019-06-11

本文共 967 字,大约阅读时间需要 3 分钟。

问题描述:

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:

public class ListNode{    int value;    ListNode next;    public ListNode(int v){
value = v;}}

思路:常规的做法就是遍历链表找到被删除结点的前趋p,然后改变p->next的指向即可。但是这种做法的时间复杂度为O(n)。

因此我们要另寻他路。现在我们已知了要删除的结点指针,那么我们很容易获得它的后继,那么显然我们,我们可以直接将其后继内容放在该结点上,然后删除后继结点即可

public void deleteNode(ListNode head, ListNode pToBeDeleted){    if(head == null || pToBeDeleted == null){        return;    }    ListNode q = pToBeDeleted->next;    //要删除的不是尾结点    if(q != null){        pToBeDeleted->value = q -> value;        pToBeDelted->next = q->next;        q = null;    }    //链表只有一个结点,删除头结点(也是尾节点)    else if(head == pTobeDeleted){        pToBeDeleted = null;        head = null;    }else{
//链表中有多个结点,删除尾结点 ListNode q = head; while(q -> next != pToBeDeleted){ q = q -> next; } q -> next = null; pToBeDeleted = null; }}

上述代码基于一个假设:要删除的结点的确在链表中。

转载于:https://www.cnblogs.com/wenbaoli/p/5655723.html

你可能感兴趣的文章
CSS实现div的高度填满剩余空间
查看>>
Golang常用数据结构(对照python)
查看>>
利用 ssh 的用户配置文件 config 管理 ssh 会话
查看>>
Flutter Native调用Dart端方法,并获取数据
查看>>
程序设计实习MOOC / 程序设计与算法(一)第二周测验(2018春季)
查看>>
【SignalR学习系列】3. SignalR实时高刷新率程序
查看>>
物联网之RFID使用——小学生到校通报系统
查看>>
康德的道德观与哲学观
查看>>
“获取硬盘信息失败,请谨慎操作”的解决方案
查看>>
signed 与 unsigned 有符号和无符号数
查看>>
c++链栈
查看>>
c# winform 根据窗体自动调整控件
查看>>
MyBatis 查询
查看>>
一键GHOST优盘版安装XP/win7系统
查看>>
MyEclipse xml 手动添加 dtd
查看>>
字符串操作函数
查看>>
anyproxy-修改返回内容(beforeSendResponse)
查看>>
3基本概念
查看>>
iOS 触摸的位置放一个大头针
查看>>
Apache无法启动解决 the requested operation has failed
查看>>