【Offer】[18-1] 【在O(1)时间内删除链表节点】
- 题目描述
- 思路分析
- 测试用例
- 代码链接
题目描述
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
思路分析
一般我们删除单链表中的节点是需要遍历链表,找到要删除节点的前一个元素,但是那样的时间复杂度为O(n),要在O(1)的时间内删除给出的节点,我们可以将删除节点p
的下一个结点的值赋给p
,而我们只要删除p
的下一个结点就可以了,同时我们还要注意边界值:
- 要删除的节点p是尾结点,
- 要删除的链表中只有一个节点 等特殊情况
测试用例
- 功能测试(多个结点链表,删除头结点、中间结点和尾结点;单个结点链表)
- 特殊测试(头结点或删除结点为null)
## Java代码
public class Offer18_01 {public static void main(String[] args) {System.out.println("****功能测试***");test1();System.out.println("***仅有一个节点元素的单链表测试***");test2();System.out.println("***特殊输入测试****");test3();}public static ListNode deleteNodeInList(ListNode pHead, ListNode pdelNode) {return Solution1(pHead, pdelNode);}/*** 如果要删除的节点是中间节点,我们可以直接将它后面的一个节点的值赋给它, 而要删除的节点就变成了它后面的一个节点,* 要考虑删除节点是尾结点,和链表中只有一个节点的情况* * @param pHead* @param pdelNode* @return*/private static ListNode Solution1(ListNode pHead, ListNode pdelNode) {if (pHead == null || pdelNode == null) {return pHead;}if (pdelNode.next != null) {// 要删除的节点在链表中间位置ListNode p = pdelNode.next;pdelNode.val = p.val;pdelNode.next = p.next;p = null;} else if (pHead.next == pdelNode) {// 链表只有一个结点pHead.next = pdelNode.next;pdelNode = null;} else {// 链表中有多的节点,要删除的节点是尾结点ListNode p = pHead;while (p.next != pdelNode) {// 搜寻pdelNode的前一个节点p = p.next;}p.next = pdelNode.next;pdelNode = null;}return pHead;}/*** 功能测试*/private static void test1() {//System.out.println("(不加头结点)有三个节点元素的单链表");ListNode node3 = new ListNode(9, null);ListNode node2 = new ListNode(2, node3);ListNode node1 = new ListNode(4, node2);ListNode pHead = new ListNode(-1, node1);// 头结点System.out.println("删除之前");printListNode(pHead);System.out.println("删除之后--->");deleteNodeInList(pHead, node2);printListNode(pHead);}private static void test2() {//System.out.println("(不加头结点)仅有一个节点元素的单链表");ListNode node1 = new ListNode(4, null);ListNode pHead = new ListNode(-1, node1);// 头结点System.out.println("删除之前");printListNode(pHead);System.out.println("删除之后-->");deleteNodeInList(pHead, node1);printListNode(pHead);}/*** 特殊输入测试*/private static void test3() {//System.out.println("(不加头结点)有三个节点元素的单链表");ListNode node3 = new ListNode(9, null);ListNode node2 = new ListNode(2, node3);ListNode node1 = new ListNode(4, node2);ListNode pHead = new ListNode(-1, node1);// 头结点System.out.println("删除之前");printListNode(pHead);System.out.println("删除之后(传入参数为null,null)--->");deleteNodeInList(null, null);printListNode(pHead);}/*** 打印链表* * @param pHead*/private static void printListNode(ListNode pHead) {ListNode p = pHead.next;while (p != null) {System.out.print(p.val + " ");p = p.next;}System.out.println();}}
代码链接
剑指Offer代码-Java
转载于:https://www.cnblogs.com/haoworld/p/offer181-zaio-1-shi-jian-nei-shan-chu-lian-biao-ji.html
【Offer】[18-1] 【在O(1)时间内删除链表节点】相关推荐
- 面试题18: 删除链表节点:删除链表中重复的节点
/******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...
- C#刷剑指Offer | 在O(1)时间删除链表节点
[C#刷题]| 作者 / Edison Zhou 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目),希望对你有帮助!本文题目为:在O(1)时间删 ...
- 在O(1)时间删除链表节点
在O(1)时间删除链表节点 [题目]: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该节点. void deleteNode(ListNode* pListHead, ListN ...
- C语言通过链表指针删除链表节点的算法(附完整源码)
C语言通过链表指针删除链表节点的算法 C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) #in ...
- 关于递归删除链表节点为什么不会断链问题解释
问题的由来: 当你第一次实现用递归实现链表删除功能的时候,是否有一丝丝的考虑过.这个问题呢?为什么对于非递归版本的删除必须要知道当前要删除节点的前驱,而需要对其前驱节点的next域指针进行修改. ...
- 剑指offer--在O(1)时间内删除链表结点
记录来自<剑指offer>上的算法题. 题目如下: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 结点定义如下: struct ListNode{int m_ ...
- 单向链表在O(1)时间内删除一个节点
欢迎来踩 关于留言板 - 码到城攻多数文章不支持留言,此处为统一留言处https://www.codecomeon.com/posts/1/ 说删链表节点,第一时间想到就是遍历整个链表,找到删除节点的 ...
- 剑指offer-面试题13.在O(1)时间删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next ...
- 数据结构-在O(1)时间删除链表节点
题目:给定单向链表的头指针和一个节点的指针,定义一个函数在O(1)时间删除该节点. 分析:本题目是基于一个假设,要删除的节点的确在链表中.因为我们需要O(n)的时间来判断该节点是否在链表中. /* 剑 ...
最新文章
- 术,路,心:陈天桥的大脑行旅
- 面试题----寻找比一个N位数大的“下”一个数
- java中hashMap的排序
- enterpriseTECH Dec 10
- PHP7 serialize_precision 配置不当导致 json_encode() 浮点小数溢出错误
- day1||python
- mysqls压力测试怎么用_阿里研究员:测试稳定性三板斧,我怎么用?
- linux eth0 proxy arp,在interface vlan下敲no ip proxy-arp什么意思
- python2.7安装pygame_python 安装 pygame了
- 云服务器装桌面后怎么连接,云桌面具体的安装步骤是怎样的
- 面向对象:结构化开发方法和面向对象开发方法
- win10文件资源管理器打开时很慢
- VR家庭火灾安全系统_VR校园火灾安全系统_VR工厂火灾安全系统_VR宿舍火灾安全系统多场景选择
- 如何搭建短信中心号码服务器,短信中心号码怎么设置?设置短信中心号码两种方法介绍...
- c++ 内存泄漏(Detected memory leaks)解决
- HBase (一) --------- HBase 简介
- centos高清分辨率
- 二项分布最大值,泊松分布的推导,几何分布的推导 (概统2.证明)
- SAP案例教程FIAP应付会计前台操作
- 比尔盖茨的60条睿智语录